gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:02:13 26 4
gpt4 key购买 nike

我正在试验受 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

这里发生了什么?

编辑,发布答案:

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

最佳答案

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

关于c++ - 通用引用产生具有相同地址的不同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25275177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com