【发布时间】:2012-03-28 19:43:37
【问题描述】:
我想实现一个填充向量然后返回右值引用的函数。我厌倦了这样的事情:
std::vector<int> &&fill_list() {
std::vector<int> res;
... do something to fill res ...
return res;
}
int main(int argc, char **argv) {
std::vector<int> myvec = fill_list();
return 0;
}
但这不起作用,我收到以下错误:
error: invalid initialization of reference of type 'std::vector<int>&&' from expression of type 'std::vector<int>'
那么,总而言之,正确的做法是什么?我认为我还没有得到右值引用。
【问题讨论】:
-
即使编译成功,它也会返回一个悬空引用。 为什么你想返回一个右值引用?为什么不简单地按值返回?
-
我认为你对右值引用的理解是错误的:它是一个无论如何都会被破坏的 value 可以移动而不是需要复制它。如果你直接返回一个右值引用,那么不再有值了,因为它在在你有机会移动它的内容之前已经被销毁了。
-
@Sambatyon :如果您按值返回,则将使用 then 移动语义(如果 NRVO 没有启动)。您显示的确实是一个悬空引用,就像您的返回类型是
std::vector<int>&一样。 -
@Sambatyon: idljarn 是正确的,返回一个 rvalue-reference 和一个 lvalue-reference 在这里没有区别,引用将指向一个对象刚刚被销毁。
标签: c++ c++11 rvalue-reference