提问者:小点点

返回作为参数传递给函数的rvalue引用


我想知道是否可以安全地返回作为参数传递给函数的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生成不同的地址。 这是否意味着结构对象的实际构造发生在函数调用之前,并且我可以安全地做这类事情?


共1个答案

匿名用户

我能安全地做这种事吗?

否。struct{1}struct{2}构造临时对象,这些对象在完整表达式后被销毁。 这意味着引用LValue1LValue2总是悬空的。 取消对它们的引用会导致未定义的行为。

所有临时对象在计算(词法上)包含它们创建点的完整表达式时的最后一步被销毁