【发布时间】:2016-04-23 12:22:04
【问题描述】:
情况
我正在设计一个支持移动语义的类模板logic。 logic 有一个模板参数Visitor 和一个类型为Visitor& 的引用成员。那是一个库代码。
Users 继承类模板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实现你的移动构造函数(并且可能删除移动赋值)。
标签: c++ move-semantics