我想知道是否可以安全地返回作为参数传递给函数的rvalue引用,并且它不会随着堆栈的展开而被破坏。
struct Struct { int m; };
Struct& f(Struct&& rvalue)
{
std::cout << &rvalue << '\n';
return rvalue;
}
void main()
{
Struct& lvalue1 = f(Struct{ 1 });
std::cout << &lvalue1 << '\n';
Struct& lvalue2 = f(Struct{ 2 });
std::cout << &lvalue2 << '\n';
std::cin.get();
}
输出:
00A3F844
00A3F844
00A3F838
00A3F838
此代码为rvalues生成不同的地址。 这是否意味着结构对象的实际构造发生在函数调用之前,并且我可以安全地做这类事情?
我能安全地做这种事吗?
否。struct{1}
和struct{2}
构造临时对象,这些对象在完整表达式后被销毁。 这意味着引用LValue1
和LValue2
总是悬空的。 取消对它们的引用会导致未定义的行为。
所有临时对象在计算(词法上)包含它们创建点的完整表达式时的最后一步被销毁