C++11 通用参考和命名参数Ideom

C++11 通用参考和命名参数Ideom,c++11,gcc,forwarding-reference,C++11,Gcc,Forwarding Reference,我编写了这段代码并用gcc编译。 我希望得到结果“2”,但结果是“0” 其他编译器的叮当声和vc打印“2”。 这是否是未定义的行为 #include <stdio.h> struct Test { Test& inc() { ++value; return *this; } int value = 1; }; int main() { auto&& t = Test().inc(); //

我编写了这段代码并用gcc编译。 我希望得到结果“2”,但结果是“0”

其他编译器的叮当声和vc打印“2”。 这是否是未定义的行为

#include <stdio.h>

struct Test {
    Test& inc() {
        ++value;
        return *this;
    }

    int value = 1;
};

int main() {
    auto&& t = Test().inc(); // The life-time of the temporary might extended.
    printf("%d\n", t.value); // gcc prints "0". dangling reference?

    return 0;
}
#包括
结构测试{
测试公司(){
++价值观;
归还*这个;
}
int值=1;
};
int main(){
auto&&t=Test().inc();//临时文件的生命周期可能会延长。
printf(“%d\n”,t.value);//gcc打印“0”。是否挂起引用?
返回0;
}
c、 f.在上构建reslut

转发引用(universal references已被重命名为)是不相关的——您会在常规引用中观察到相同的行为

问题是
测试的生存期没有延长,因为它没有直接绑定到引用,如
auto&&t=Test()将是。相反,它的成员函数返回一个左值引用,该引用用于推断并初始化
t
,作为
测试&
(您可以通过
decltype(t)
)进行检查)。然后临时的被破坏,引用现在处于悬挂状态,使用它是未定义的行为。

转发引用(这就是通用引用被重命名为的)是不相关的——您将观察到与常规引用相同的行为


问题是
测试的生存期没有延长,因为它没有直接绑定到引用,如
auto&&t=Test()将是。相反,它的成员函数返回一个左值引用,该引用用于推断并初始化
t
,作为
测试&
(您可以通过
decltype(t)
)进行检查)。然后临时文件被销毁,引用现在处于悬挂状态,使用它是未定义的行为。

我不知道如何自动推断
auto&&t=Test().inc()
不是
auto&&t=Test();t、 公司()。谢谢你,昆汀
gcc-7-f在作用域之后使用anizize address
可以检测到此错误。我对自动推断不太了解
auto&&t=Test().inc()
不是
auto&&t=Test();t、 公司()。谢谢你,昆汀<代码>gcc-7-在作用域之后对地址使用进行管理
可以检测到此错误。