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

C++ 用户声明的默认构造函数+;类内初始值设定项!=用户提供的构造函数?,c++,c++11,default-constructor,c++14,in-class-initialization,C++,C++11,Default Constructor,C++14,In Class Initialization,报告清楚地解释了这一点 如果类或结构没有用户定义的默认构造函数,C++ 不允许默认构造它的常量实例,如 这([dcl.init],第9页) 其基本原理是,如果const对象未正确初始化,则以后无法对其进行更改。以下代码只有一个user-声明的Test的默认构造函数,但其所有成员都有类内初始值设定项 #include<iostream> class Test { public: Test() = default; void print() const { std::c

报告清楚地解释了这一点

如果类或结构没有用户定义的默认构造函数,C++ 不允许默认构造它的常量实例,如 这([dcl.init],第9页)

其基本原理是,如果const对象未正确初始化,则以后无法对其进行更改。以下代码只有一个user-声明的
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
}
#包括
课堂测试
{
公众:
Test()=默认值;

void print()常量{std::cout是的,这是一个已知的问题。请看。规范中还没有修复它。

我认为这是Clang中的一个错误/错误,g++接受代码是正确的。@JerryCoffin是否有任何标准的引用?我问,因为没有类内初始值设定项,标准说Clang是正确的。这不是一个真正的引用,而是N3337提供的ding已经被更改,所以这个要求已经消失了。考虑到它在标准中,我想称它为错误或bug可能有点不准确,但在这一点上,我认为大多数编译器都忽略了C++11本身,而追求更新的草案。@JerryCoffin标记为“活动”的DR也是这样吗已经纳入规范,与我的回答相反?采用什么解决方案?@Johanneschaub litb:TBH,我不完全确定——DR中引用的措辞似乎已经消失,但这可能是其他编辑的副作用,他们仍在进行更多更改,以更具体地处理此DR(或者不——不回顾会议记录,我不知道为什么事情会变成现在的样子)。+1并被接受。很高兴知道它在雷达上。你有机会访问Clang 3.3/3.4来检查它是否仍然是一个问题吗?@TemplateRex不幸的是,Clang 3.4(中继184647)仍然是一个问题(