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

时间:2014-08-12 22:32:31

标签: c++ universal-reference

我正在试验受Scott Meyers article on the subject启发的环球参考。

所以我尝试了以下内容:

#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;
}

输出:

0x7ffff8b957ac
0x7ffff8b957ac, 10
0x7ffff8b957ac
0x7ffff8b957ac, 20
This is peculiar.

我的印象是&j == &k会保证j==k

这里发生了什么?

编辑,回答:

轶事反思: 在第二次打印输出中输出j而不是k使得程序输出完全没有。我想我应该感到高兴的是没有切斯特菲尔德沙发或鲸鱼。

1 个答案:

答案 0 :(得分:2)

在这些临时对象的生命周期结束后,您正在使用绑定到临时对象的引用。在大多数情况下,临时只能持续到声明结束或其他完整表达;并且该程序没有任何延长其生命周期的例外情况。由于对象的生命周期不重叠,因此允许编译器对两者使用相同的地址。使用这些死对象的cout语句是未定义的行为 - 任何事情都可能发生。