讓我有一個自定義的包裝容器。我想這樣使用它:如何將右值生命週期擴展到我的自定義容器生命週期?
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)。即在這種情況下,你不能有任何用戶定義的構造函數。否則,你只需要給它賦值語義。 –