为什么引用类型成员的默认初始化会导致编译器警告?

Nik*_*vak 1 c++ const reference compiler-warnings

我有以下代码:

class A {
 public:
  A() { }
};

class B {
 private:
  const A &a;

 public:
  B() : a() { }
  B(const A &ina) : a(ina) { }
};
Run Code Online (Sandbox Code Playgroud)

编译结果如下:

ab.cpp:在构造函数'B :: B()'中:

ab.cpp:11:警告:'const A&B :: a'的默认初始化,它有引用类型

为什么这会导致警告,我该如何解决?

AnT*_*AnT 12

C++语言中的引用可以被认为是其他对象的"替代名称".名称总是指一个对象,没有该对象就不能存在,即引用不能"不参考".这意味着必须在引用创建时立即将引用绑定到目标对象,并且只要该引用存在,就保持绑定到该对象.该语言专门用于尽可能强制执行该规则.如果引用成员位于非聚合类类型中,则必须在构造函数初始化列表中显式初始化此类成员.

严格地说,要求默认初始化引用的程序是不正确的.在日常术语中,它应该是"错误",而不是"警告".所以,真正的"为什么"这就是为什么你的编译器只发出一个警告(尽管正式的任何诊断消息都足以报告格式错误的代码).


Pie*_*aud 5

从标准:

8.5.3 参考文献 [dcl.init.ref]

  1. 声明为 T& 或 T&& 的变量,即“对类型 T 的引用”(8.3.2),应由 T 类型的对象或函数或可转换为 T 的对象初始化。

  2. [...]

  3. 仅在参数声明 (8.3.5)、函数返回类型的声明、其类定义中的类成员声明 (9.2) 以及明确指定 extern 说明符的情况下,才可以省略用于引用的初始化程序用过的。

的构造器 B是错误的,因为它在内部调用了引用的默认构造函数,这是不可能的。

引用成员必须在构造函数的成员初始化列表进行初始化。这就是您的默认构造函数格式错误的原因。