语言规则说明const
,用户定义的类的定义需要进行值初始化或者具有用户提供的默认构造函数。
const struct X { int v; } x;
如果你不给它一个,那么你将永远不能给v
一个值,因为它不能被改变。但是我们如何从这样的用户提供的构造函数中受益:
const struct X { X() {} int v; } x;
这仍将默认构造v
,这将使其保持未初始化状态。为什么我们需要这个构造函数来编译它,而没有一个没有好处?
答案 0 :(得分:4)
在第一种情况下,编译器只能从类定义(不是任何成员的定义)告诉变量不会被初始化。为了定义变量,类定义必须是可用的,因此如果const
变量在这种情况下保持未初始化,则表明规则说程序格式错误很简单。
在第二种情况下,需要定义用户声明的构造函数来确定它是否已初始化。当编译器处理变量定义时,这不一定可用,所以通常它不能检查构造函数是否初始化所有内容;构造函数定义不一定可用。通常情况下,即使在这样的情况下也不需要诊断,其中构造函数的定义可用且编译器可以解决它。