C++ 通用引用生成具有相同地址的不同实例

C++ 通用引用生成具有相同地址的不同实例,c++,universal-reference,C++,Universal Reference,我当时是在试验受其启发的通用参考书 因此,我尝试了以下方法: #include <iostream> #include <cassert> template<typename T> T& f(T&& var){ std::cout<< &var << std::endl; return var; } int main() { int& j = f(10); st

我当时是在试验受其启发的通用参考书

因此,我尝试了以下方法:

#include <iostream>
#include <cassert>

template<typename T>
T& f(T&& var){
    std::cout<< &var << std::endl;
    return var;
}

int main() {
    int& j = f(10);
    std::cout<< &j << ", " << j << std::endl;
    int& k = f(20);
    std::cout<< &k << ", " << k << std::endl;

    if( &j == &k ){
        std::cout<< "This is peculiar." <<std::endl;
    }

    return 0;
}
我的印象是
&j==&k
将保证
j==k

这里发生了什么

编辑、发布答案:

轶事反思:
在第二次打印输出中输出j而不是k使程序完全不输出任何内容。我想我应该很高兴没有切斯特菲尔德沙发或鲸鱼参与其中

在临时对象的生存期结束后,您正在使用绑定到这些临时对象的引用。在大多数情况下,临时声明只在声明或其他充分表达结束之前有效;这个程序没有任何会延长其生命周期的异常。由于对象的生存期不重叠,因此允许编译器对这两个对象使用相同的地址。你的
cout
语句,使用那些死对象,是未定义的行为-任何事情都可能发生。

通用行为。对不起,我指的是未定义的行为。@Giraffe船长,(剧透者:答案是否定的)正如我妻子经常说的,“悬挂参考”…确实如此。也许我应该自己推断出来。在
T&
方面,我仍在与直觉作斗争。谢谢。如果您的引用类型都是
const int&
,那么您将遇到同样的问题,并且可能会得到同样的结果。这两种引用与生存期和临时值的交互作用相同,只是没有
const
的左值引用根本不会绑定到右值。
0x7ffff8b957ac
0x7ffff8b957ac, 10
0x7ffff8b957ac
0x7ffff8b957ac, 20
This is peculiar.