通用引用产生具有相同地址的不同实例
Universal reference producing different instances with the same address
受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
语句,使用那些死对象,是未定义的行为-任何事情都可能发生。
相关文章:
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 常量类实例的C++内存地址
- c++如何获取模板函数实例的地址
- 类实例的地址是否等于类中唯一元素的地址
- C++ 实例地址更改
- 将新放置到缓冲区后,缓冲区和实例是否具有相同的 void* 地址?
- 字节或整数地址预期,而不是str实例python 3
- 构造函数C++中的类实例内存地址
- 在python ctypes中截断了指向C++自定义类实例的指针地址
- 获取模板类对象的地址将导致模板参数的完全实例化
- 如何在给定设备实例ID的情况下可靠快速地获取网卡的MAC地址
- 创建实例时静态变量的地址
- 没有类实例的类成员的地址
- 通用引用产生具有相同地址的不同实例
- 使LLDB将地址重新解释为指向模板实例化类型对象的指针
- 获取函数模板的地址时隐式实例化
- 跨编译单元的相同函数模板实例化的地址
- 重载运算符 std::ostream& 运算符<<打印实例内存地址
- 在不同地址创建类的新实例
- 当获取一个地址时,模板类型(类/函数)的实例化规则是什么?