【发布时间】:2013-07-05 22:20:59
【问题描述】:
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 没有。
问题:为什么完整的类内初始化器 + 用户声明的默认构造函数的组合不足以默认构造一个 const 对象? C++14 标准是否正在进行修复?
更新:任何人都可以尝试使用 Clang 3.3 / 3.4 来查看与 Clang 3.2 相比是否已修复此问题?
【问题讨论】:
-
我认为这是Clang中的一个错误/bug,g++接受代码是正确的。
-
@JerryCoffin 有任何标准的引用吗?我问是因为没有类内初始化程序,标准说 Clang 是正确的。
-
不是真正的报价,但到 N3337 时,措辞已经更改,因此此要求已消失。鉴于它是在标准中,我想称它为错误或错误可能有点不准确,但在这一点上,我认为大多数编译器大多忽略 C++11 本身 i> 并追求更新的草稿。
-
@JerryCoffin 那么标记为“活动”的 DR 是否已经包含在规范中,这与我的回答所说的相反?用什么解决方案?
-
@JohannesSchaub-litb:TBH,我不完全确定——DR 中引用的措辞似乎已经消失,但这可能是其他编辑的副作用,它们是仍在进行更多更改以更具体地处理此 DR(或不 - 不回顾会议记录,我不确定为什么事情会变成现在的样子)。
标签: c++ c++11 default-constructor c++14 in-class-initialization