【问题标题】:Reference initialization with constructor使用构造函数进行引用初始化
【发布时间】:2020-03-19 20:56:54
【问题描述】:
const T   a {}; // constant of type T
const T&  b {}; // ???
      T   c {}; // variable of type T
      T&  d {}; // error

ab 之间有什么区别?
b 是一个引用,但我没有为其分配对象:在该指令中,我通过 T 构造函数对其进行了初始化。
b的地址在a和c的地址之间,所以ba似乎没有区别。

如果我可以声明和初始化b,为什么d 会出现编译错误?

我谈到了泛型类型 T。我测试了上面的代码,无论是原始类型还是类,结果都是一样的。

【问题讨论】:

  • 你试过编译代码吗?你注意到了什么?
  • ab 完全相同,除了 decltype(x) 的结果

标签: c++ constructor reference initialization declaration


【解决方案1】:

在这些声明中

const T   a {}; // constant of type T
const T&  b {}; 

创建了默认初始化的常量对象a和默认初始化的临时对象的常量引用b

编译器针对此引用声明发出错误

T&  d {}; // error

因为声明了对临时对象的非常量引用。

您可以通过以下方式声明右值引用

T&&d {};

这是一个演示程序

#include <iostream>

int main() 
{
    const int &ri {};

    std::cout << "ri = " << ri << '\n';

    int && rri {};

    std::cout << "rri = " << rri << '\n';

    return 0;
}

程序输出是

ri = 0
rri = 0

【讨论】:

  • 所以我猜想在b 中临时对象的生命周期被延长,然后“正确”d 我将不得不使用右值引用:T&amp;&amp; d {}; 对吗?
  • @DPD- 两个临时对象的生命周期与引用这些临时对象的引用的生命周期一样长。
猜你喜欢
  • 2016-08-17
  • 2020-05-06
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2017-08-28
  • 2018-08-02
相关资源
最近更新 更多