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

User-declared default constructor + in-class initializers != user-provided constructor?

本文关键字:构造函数 用户 默认 声明      更新时间:2023-10-16

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

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

相关文章: