假设我有一个如下定义的类:
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;代码编译了.
| 归档时间: |
|
| 查看次数: |
5356 次 |
| 最近记录: |