Clang documentation巧妙地解释了
如果类或结构没有用户定义的默认构造函数,则为C ++ 不允许你默认构造它的const实例 这([dcl.init],p9)
基本原理是如果const对象未正确初始化,则以后无法更改。以下代码只有Test
的用户 - 声明的默认构造函数,但其所有成员都具有类内初始值设定项,
#include<iostream>
class Test
{
public:
Test() = default;
void print() const { std::cout << i << "\n"; }
private:
int i = 42; // will propagate to the default constructor!
};
int main()
{
Test const t; // <-- Clang chokes on the const keyword, g++ does not
t.print(); // prints 42
}
所以用户提供默认构造函数的基本原理对我来说似乎是多余的。事实上,g ++ 4.8.1确实编译它没有问题(Online Example),虽然 Clang&lt; = 3.2 没有。
问题:为什么完整的类内初始化器+用户声明的默认构造函数的组合不足以默认构造一个const对象?是否有针对C ++ 14标准的修复程序?
更新:任何人都可以尝试使用Clang 3.3 / 3.4,看看与Clang 3.2相比这是否已修复?
答案 0 :(得分:11)
是的,这是一个已知问题。见http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253。它尚未在规范中修复。