【问题标题】:Universal reference producing different instances with the same address通用引用产生具有相同地址的不同实例
【发布时间】:2014-08-12 22:32:31
【问题描述】:

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

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

这里发生了什么?

编辑,发布答案:

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

【问题讨论】:

标签: c++ universal-reference


【解决方案1】:

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

【讨论】:

  • 确实如此。也许我应该自己推断出这一点。我仍然在为T&amp;&amp; 的直觉而苦苦挣扎。谢谢。
  • 好吧,如果你所有的引用类型都是const int&amp;,你会遇到同样的问题并且可能会得到同样的结果。这两种引用与生命周期和临时对象的交互相同,只是没有const 的左值引用根本不会绑定到右值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2019-06-16
  • 2018-02-20
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多