ale*_*in0 16 c++ initializer-list aggregate-initialization c++11
我发现对类使用初始化列表语法的可能性取决于类字段是否具有默认值.为什么?
确切地说,请考虑以下代码:
class S
{
public:
int a;
};
...
int a;
S s{ a };
Run Code Online (Sandbox Code Playgroud)
它编译没有任何问题.但是如果我在类字段中添加一个默认值,它就会停止构建:
class S
{
public:
int a = 0;
};
...
int a;
S s{ a };
Run Code Online (Sandbox Code Playgroud)
错误1错误C2440:'初始化':无法从'initializer-list'转换为'S'
为什么?还有什么影响这样的构造函数生成?
Hol*_*olt 19
在C++ 14中,您的代码是有效的,应该使用任何与C++ 14兼容的编译器进行编译.
但是在C++ 11中:
如果您没有默认值a
,则您的类型是聚合,因此可以执行聚合初始化:
聚合是以下类型之一:
数组类型
类类型(通常是struct或union),具有
- 没有私有或受保护的非静态数据成员
- 没有用户提供的构造函数,包括那些从公共基础继承的构造函数(自C++ 17以来)(允许显式默认或删除构造函数)(自C++ 11起)
- 没有虚拟,私有或受保护(自C++ 17)基类
- 没有虚拟成员功能
- 没有默认成员初始值设定项(从C++ 11开始,直到C++ 14)
只要为属性添加默认值,a
就不能再执行聚合初始化,因为类型停止是聚合.
归档时间: |
|
查看次数: |
498 次 |
最近记录: |