我正在试验受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使得程序输出完全没有。我想我应该感到高兴的是没有切斯特菲尔德沙发或鲸鱼。
答案 0 :(得分:2)
在这些临时对象的生命周期结束后,您正在使用绑定到临时对象的引用。在大多数情况下,临时只能持续到声明结束或其他完整表达;并且该程序没有任何延长其生命周期的例外情况。由于对象的生命周期不重叠,因此允许编译器对两者使用相同的地址。使用这些死对象的cout
语句是未定义的行为 - 任何事情都可能发生。