类初始值设定项中用户声明的默认构造函数+!=用户提供的构造函数
User-declared default constructor + in-class initializers != user-provided constructor?
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。它还没有在规范中修复。
相关文章:
- 参数包构造函数在类模板中隐藏用户定义的转换
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 创建用户定义的复制构造函数时无法创建对象
- C++中用户定义的构造函数出现问题
- 如何使用构造函数声明指向用户定义对象的指针?
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 用户定义的构造函数重载与参数超类的重载不匹配
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- C++使用默认的复制构造函数,即使用户使用模板定义了一个复制构造函数
- 作为传递给 CPP 类构造函数的参数的用户定义函数
- 使用用户定义的构造函数初始化C++结构
- 用户定义类的构造函数不使用矢量
- 为什么复制构造函数不是微不足道的,因为有一个用户定义的析构函数?
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- 为什么转换涉及两个用户定义的转换功能/构造函数
- 保证复制责任的行为是否取决于用户定义的复制构造函数的存在
- 如何使用Chaiscript中用户类型的std :: initializer_list调用构造函数
- 默认构造函数 Eclipse 项目中的用户输入
- 为什么'std::p air'允许使用用户定义的已删除移动构造函数从类类型的右值初始化?