形勢如何支持具有參考
我設計,支持移動語義類模板logic
類模板移動語義。 logic
具有模板參數Visitor
,並且類型爲Visitor&
的參考成員。這是一個庫代碼。
用戶繼承類模板logic
並傳遞一個自定義訪問者,如my_visitor
。自定義訪問者可能包含可移動成員。例如,my_visitor
具有構件v
這類型是std::vector
。
問題
見test2()
。當我移動my_logic時,my_visitor::v
按預期移動。但是,logic<Visitor>::vis
指的是從對象移出。有沒有什麼好的方法可以引用移動到的對象?
#include <iostream>
#include <vector>
// Library code
template <typename Visitor> // Concept: Visitor should have visit()
struct logic {
logic(Visitor& v):vis(v) {}
void execute() {
vis.visit();
}
// Other APIs
Visitor& vis;
// Other member variables...
};
// User code
struct my_visitor {
my_visitor() { v.push_back(42); }
void visit() {
std::cout << "expected 1, actual " << v.size() << std::endl;
}
std::vector<int> v;
};
// User inherits all logic's APIs
struct my_logic : logic<my_visitor> {
my_logic():logic<my_visitor>(mv) {}
my_visitor mv;
};
void test1() {
std::cout << "test1" << std::endl;
my_logic m;
m.execute();
}
void test2() {
std::cout << "test2" << std::endl;
my_logic m1;
{
my_logic m2(std::move(m1)); // logic::vis refers to moved from my_visitor...
m2.execute();
}
}
int main() {
test1();
test2();
}
您必須實現'my_logic'的移動構造函數(並可能刪除移動賦值)。 – Jarod42