让我有一个自定义的包装容器。我想这样使用它:如何将右值生命周期扩展到我的自定义容器生命周期?
double d = 3.14;
MyContainer<std::vector<int>> pointer = new std::vector<int>();
MyContainer<std::string> rvalue = std::string("foo");
MyContainer<int> rvalue2 = 5 + 8;
MyContainer<double> lvalue = d;
我不想存储rvalues的副本(引用是好的)。 Rvalue参考允许我这样做:
std::string string1 = "foo";
std::string string2 = "bar";
std::string&& string3 = string1 + string2;
string3 += "test";
基本上我想延长rvalues的生命期到我的容器的一生。然而,当我这样做:
template<class T>
class MyContainer {
public:
MyContainer(T&& obj) : object(obj) {}
T&& object
...
};
...
MyContaier<std::string> container = MyContainer(std::string("foo"));
我得到一个错误(不能绑定 '的std :: string' 左值到 '的std :: string & &')。这个例子稍有不同,但我只想了解一个大概的想法。我怎样才能避免这种情况?
你的意思是'T &&对象;'在MyContainer'中,而容器实际上是一个“容器引用”?如果是这样,那么你的'std :: vector'例子将无法编译,并且这与你的其他案例有不同的语义(你在这种情况下使用了动态分配) –
'object(obj)'应该是'object(std :: move(obj))',这可能是你的编译器错误,但它不能解决生命期问题(你现在有沉默的未定义行为) –
延长工作时间的唯一方法是如果MyContainer是一个集合,使用聚合初始化,[见这里](http://stackoverflow.com/questions/23892018/extending-temporarys-lifetime-through-rvalue-data-member-works-with-aggregate)。即在这种情况下,你不能有任何用户定义的构造函数。否则,你只需要给它赋值语义。 –