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

时间:2013-07-05 22:20:59

标签: c++ c++11 default-constructor c++14 in-class-initialization

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相比这是否已修复?

1 个答案:

答案 0 :(得分:11)

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