此问题已在此处有答案:
Why does C++ require a user-provided default constructor to default-construct a const object?(5个答案)
5年前关闭。
Clang文档清楚地解释了这一点
如果一个类或结构没有用户定义的默认构造函数,C++不允许你像下面这样构造它的const示例([dcl.init],p9)。
其基本原理是,如果一个const对象没有正确初始化,它以后就不能被更改。下面的代码只有一个user-declared的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
}
因此,user-提供默认构造函数的理由对我来说似乎是多余的。事实上,g++ 4.8.1编译它没有问题(Online Example),尽管Clang <= 3.2没有。
问题:为什么完整的类内初始化器+用户声明的默认构造函数的组合不足以默认构造一个const对象?C++14标准是否正在进行修复?
更新:大家可以试试Clang 3.3 / 3.4,看看这个问题和Clang 3.2相比有没有修复?
1条答案
按热度按时间k2arahey1#
是的,这是一个已知问题。请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#253。规范中尚未修复此问题。