为什么默认成员值禁止使用支持列表初始化
Why do default member values prohibit use of braced-list initialization?
考虑这个结构:
struct S { int index; };
它可以使用支持列表进行初始化,如下所示:
S s{10}; //s::index becomes 10
但是,如果我为成员指定一个默认值:
struct S { int index = -1; };
支持列表初始化给我一个编译器错误,它无法将initializer list
转换为S
。我怀疑这可能与为结构生成的默认构造函数有关,因为我已经指定了默认值。但为什么初始值设定项列表不能覆盖它呢?
我想要这样做的原因是,我想用值初始化结构,或者将其默认为一些"无效"的默认值。由于这个限制,我必须自己指定一个构造函数,或者每次都显式初始化"无效"默认值。
我使用的是VS2015编译器。
在C++11中,聚合在[dcl.init.agr]中定义为:
聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有大括号或非静态数据成员的同等初始化器(9.2),没有私有或受保护的非静态数据员(第11条),无基类(第10条),也无虚拟函数(10.3)。
由于N3605删除了该条件,这一点后来得到了改进(此后重新格式化,将这些条件显示为项目符号列表。是的可读性)。
因此,在C++11中,这个:
struct S { int index = -1; };
int main() {
S s{10};
}
格式错误,因为S
不符合聚合条件,所以我们不尝试进行聚合初始化,并且int
没有匹配的构造函数。
但是在C++14中,S
是一个聚合,因此代码的格式很好。因此,您要么是在C++11模式下编译,要么VS2015还不支持C++14聚合初始化。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 编译时未启用intel oneApi CUDA支持
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- C++20 从括号中的值列表初始化聚合,不支持内部数组
- 如何获取具有 Freetype2 的真正类型字体支持的代码点列表 C++
- 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此大括号初始化列表代码
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- 为什么默认成员值禁止使用支持列表初始化
- CGIMAGE:支持的图像格式列表
- Visual Studio 2012 不支持 unordered_set (C++ STL) 的列表初始化?
- 支持空初始值设定项列表的高效对象构造
- QMedia播放列表支持的格式
- 为什么 C++11 不支持指定初始值设定项列表作为 C99
- 为什么支持的init列表在函数调用和构造函数调用中表现不同
- C++/C++11使用初始化器列表初始化对象的静态数组/向量的有效方法,并支持基于范围的
- 模板/预处理器的hack可以用来支持参数列表中间的变量参数吗?
- visualstudio2010-有没有一个列表,说明哪些编译器支持C++标准的哪一部分