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

Universal reference producing different instances with the same address

本文关键字:地址 实例 引用      更新时间:2023-10-16

受Scott Meyers关于该主题的文章的启发,我正在尝试使用通用参考。

所以我尝试了以下操作:

#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会使程序根本没有输出。我想我应该很高兴没有切斯特菲尔德沙发或鲸鱼参与其中。

在临时对象的生存期结束后使用绑定到临时对象的引用。在大多数情况下,临时语句只存在于语句或其他完整表达式的末尾;这个程序没有任何例外会延长它的生命周期。由于对象的生存期不重叠,因此编译器可以对这两个对象使用相同的地址。你的cout语句,使用那些死对象,是未定义的行为-任何事情都可能发生。