用户声明的默认构造函数+类内初始值设定项!=用户提供的构造函数?

Tem*_*Rex 13 c++ default-constructor in-class-initialization c++11 c++14

锵文档整齐地解释说,

如果类或结构没有用户定义的默认构造函数,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
}
Run Code Online (Sandbox Code Playgroud)

所以用户提供默认构造函数的基本原理对我来说似乎是多余的.事实上,g ++ 4.8.1确实可以毫无问题地编译它(在线示例),尽管Clang <= 3.2没有.

问题:为什么完整的类内initalizers +用户声明的默认构造函数的组合不足以默认构造一个const对象?是否有针对C++ 14标准的修复程序?

更新:任何人都可以尝试使用Clang 3.3/3.4,看看与Clang 3.2相比这是否已经修复?

Joh*_*itb 11

是的,这是一个已知问题.见http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253.它尚未在规范中修复.