Res*_*ion 2 c++ struct visual-studio-2015
考虑这个结构:
struct S { int index; };
Run Code Online (Sandbox Code Playgroud)
它可以使用braced-list进行初始化,如下所示:
S s{10}; //s::index becomes 10
Run Code Online (Sandbox Code Playgroud)
但是,如果我为成员指定默认值:
struct S { int index = -1; };
Run Code Online (Sandbox Code Playgroud)
支撑列表初始化给我一个无法转换initializer list为的编译器错误 S.我怀疑它可能与为结构生成的默认构造函数有关,因为我已经指定了默认值.但为什么初始化列表不能覆盖呢?
我想要这个的原因是我想要用值初始化struct或者将它默认为某些"无效"默认值.由于这种限制,我必须自己指定构造函数或每次都显式初始化"无效"默认值.
我正在使用VS2015编译器.
在C++ 11中,聚合在[dcl.init.aggr]中定义为:
聚合是一个数组或类(第9节),没有用户提供的构造函数(12.1),非静态数据成员(9.2)没有大括号或等于初始值,没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3).
由于N3605删除了这一条件(此后又进行了重新格式化以将这些条件显示为项目符号列表,因此已经得到了改进.可读性).
因此,在C++ 11中,这个:
struct S { int index = -1; };
int main() {
S s{10};
}
Run Code Online (Sandbox Code Playgroud)
由于S没有资格作为聚合,因此我们不会尝试进行聚合初始化,并且没有匹配的构造函数int.
但是从C++ 14开始,它S是一个聚合,所以代码是格式良好的.因此要么你在C++ 11模式下编译,要么VS2015不支持C++ 14聚合初始化.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |