13

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

4

1 回答 1

11

Yes, this is a known problem. See http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253 . It hasn't been fixed yet in the spec.

于 2013-07-05T22:42:13.443 回答