一些讨论警告悬挂参考,使用R值参考。我在以下示例中没有看到任何悬空引用,因为当main()终止时调用了DTOR。我错过了什么吗?
class test_ctor
{
public:
explicit
test_ctor(int x = 1):_x(x)
{
std::cout << "CTOR: " << _x << "\n";
}
~test_ctor()
{
std::cout << "DTOR: " << _x << "\n";
}
test_ctor(test_ctor const & y) = default;
test_ctor(test_ctor && y) = default;
int _x;
};
test_ctor test_rvalue()
{
test_ctor test = test_ctor(2);
return test;
}
现在我可以用两种方式使用上面的代码:
int main(int argc, const char * argv[]) {
auto test = test_rvalue();
std::cout << " test: " << test._x << " \n";
return 0;
}
或者
int main(int argc, const char * argv[]) {
auto && test = test_rvalue();
std::cout << " test: " << test._x << " \n";
return 0;
}
两种情况都有相同的输出:
CTOR:2
测试:2
DTOR:2
这意味着两者都是返回对象的有效方式。 r值参考中是否有任何副作用?
答案 0 :(得分:2)
在c++11中:
"Hello"
将auto test = test_rvalue();
的返回值移至test_rvalue()
。然后,每个非脑损坏的编译器都会将此移动 ,因此它永远不会发生。移动构造函数仍然需要存在,但永远不会被调用,并且不会发生移动的任何副作用。
test
绑定对auto&& test = test_rvalue();
返回的临时值的右值引用。临时生命周期延长以匹配参考的生命周期。
在c++17中:
test_rvalue()
auto test = test_rvalue();
的prvalue返回值用于直接构造变量test_rvalue()
。没有移动,不管是否移动。
test
案例与c++11保持不变。