声明一个类的const实例

Nim*_*Nim 36 c++ const

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

class foo{};
Run Code Online (Sandbox Code Playgroud)

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

foo f;
Run Code Online (Sandbox Code Playgroud)

怎么会出现编译错误?(uninitialized const ‘f’)

const foo f;
Run Code Online (Sandbox Code Playgroud)

我们为什么要这样做?

const foo f = foo();
Run Code Online (Sandbox Code Playgroud)

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

const foo f(); // though it compiles..
Run Code Online (Sandbox Code Playgroud)

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

const std::string f;
Run Code Online (Sandbox Code Playgroud)

那么缺少foo什么?

我意识到那里有三个问题,这是一个糟糕的形式,但我希望有人可以在一个答案中为我解决这个问题.

编辑:如果它是愚蠢的,请随时关闭它...

Kon*_*lph 47

您的类是POD(主要是因为它不提供默认构造函数).POD变量在声明时不会初始化.就是这样:

foo x;
Run Code Online (Sandbox Code Playgroud)

不会将x初始化为有意义的值.这必须单独完成.现在,当您将其声明为时const,这可能永远不会发生,因为您无法再分配或更改x.

考虑等效于int:

int x; // legal
const int y; // illegal
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,使用std::string而不是foo编译.那是因为std::string不是POD.解决您的困境的一个简单方法是为以下内容提供默认构造函数foo:

class foo {
public:
    foo() { }
};
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*itb 6

在空类的情况下引发错误是已知问题,并且报告为问题#253.