假设我的课程定义如下:
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
缺少什么?
我意识到那里有三个问题,这是一个糟糕的形式,但我希望有人可以在一个答案中为我解决这个问题。
编辑:如果这是愚蠢的话,请随时关闭它......
答案 0 :(得分:47)
您的类是POD(主要是因为它不提供默认构造函数)。 POD变量在声明时未初始化。就是这样:
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;
代码已编译。
答案 1 :(得分:6)
在空类的情况下引发错误是一个已知问题,并报告为issue #253。
答案 2 :(得分:1)
const
表示该变量在该上下文中不会更改 - 因此您无法将其重新分配给某些内容。因此,您必须对其进行初始化,否则它将永久未初始化,因此无用。
答案 3 :(得分:1)
我认为还有更多选择。你可以做到
const foo f={};
或
const foo f(());
Const意味着您以后无法分配它,因此您必须初始化它。由于您没有定义默认构造函数,因此编译器假定它必须由您初始化。 std :: string具有默认构造函数,因此编译器会隐式调用它。