声明一个类的const实例

假设我有一个类定义如下:

class foo{}; 

现在,这是完全可以接受的。

 foo f; 

怎么这是一个编译器错误? ( uninitialized const 'f'

 const foo f; 

为什么我们要这样做?

 const foo f = foo(); 

我知道为什么我们不能这样做..

 const foo f(); // though it compiles.. 

有趣的是,以下是有效的:

 const std::string f; 

那么从foo缺less什么?

我意识到这里有三个问题,这是一个糟糕的forms,但我希望有人能够在一个答案中为我解决这个问题。

编辑:请随时closures它,如果它是愚蠢的…

你的类是POD (本质上是因为它没有提供默认的构造函数)。 声明后,PODvariables不会被初始化。 就是这样的:

 foo x; 

不会将x初始化为有意义的值。 这必须分开进行。 现在,当你把它声明为const ,这可能永远不会发生,因为你不能再指定或更改x

考虑与int等价:

 int x; // legal const int y; // illegal 

你已经注意到,使用std::string而不是foo编译。 这是因为std::string不是POD。 一个简单的解决办法是为foo提供一个默认的构造函数:

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

现在你的const foo x; 代码编译。

在空class的情况下提出一个错误是一个已知的问题,并报告为问题#253 。

const ,应用于一个简单的普通旧数据variables,表明该variables不会在该上下文中发生变化 – 因此您将无法将其重新分配给某些内容。 因此,您必须对其进行初始化,否则它将永远处于未初始化状态,因此无用。

我觉得还有更多的select。 你可以做

 const foo f={}; 

要么

 const foo f(()); 

Const意味着你以后不能分配,所以你必须初始化它。 由于你没有定义默认的构造函数,因此编译器假定它必须由你初始化。 std :: string有默认的构造函数,所以它被编译器隐式地调用。