Clang 文档巧妙地解释了
如果一个类或结构没有用户定义的默认构造函数,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 确实可以毫无问题地编译它(在线示例),尽管Clang <= 3.2没有。
问题:为什么完整的类内初始化器 + 用户声明的默认构造函数的组合不足以默认构造一个 const 对象?C++14 标准是否正在进行修复?
更新:任何人都可以尝试使用 Clang 3.3 / 3.4 来查看与 Clang 3.2 相比是否已修复此问题?