为什么 MSVC 和 GCC 不能使用具有默认值的字段初始化结构
Why can't MSVC and GCC initialize a struct with a field with a default value
int main() {
struct WorkItem {
int node;
unsigned predecessorIndex = 0;
};
auto x = WorkItem { 0 };
return 0;
}
此代码与clang一起编译,但与GCC:
不正确source_file.cpp:在函数'int main()'中:
source_file.cpp:9:25:错误:呼叫'main():: workitem :: workitem()无匹配函数 auto x = workItem {0}; ^
source_file.cpp:9:25:注意:候选人是:
source_file.cpp:4:10:注意:main():: WorkItem :: WorkItem() struct workitem { ^
source_file.cpp:4:10:注意:候选人期望0参数,1提供
source_file.cpp:4:10:注意:constexpr main():: WorkItem :: WorkItem(const main():: WorkItem&)
source_file.cpp:4:10:注意:参数1的已知转换从" int"到'const main():: WorkItem&’
source_file.cpp:4:10:注意:constexpr main():: WorkItem :: WorkItem(main(Main():: WorkItem&&&)
>source_file.cpp:4:10:注意:参数1的已知转换从" int"到'main():: WorkItem&&'
或msvc:
source_file.cpp(9):错误c2440:'initialization':无法从'initializer list'转换为'main :: workitem'
source_file.cpp(9):注意:没有构造函数可以采用源类型,或者构造函数超载分辨率模棱两可
从标准的角度来看,Clang是否错误地编译了此代码,还是MSVC和GCC错误?另外,为什么删除= 0
允许GCC和MSVC编译?例如
int main() {
struct WorkItem {
int node;
unsigned predecessorIndex = 0;
};
auto x = WorkItem { 0 };
return 0;
}
GCC版本:4.9.3叮当版:3.7.0MSVC版本:19.00.24215.1
GCC版本:4.9.3
使用默认成员初始化的汇总初始化是C 14功能,直到GCC 5.x。
MSVC版本:19.00.23506
我相信这是VC 2015的更新1。使用默认会员初始化器的汇总初始化是VC直到2017年不支持的C 14功能。
- 声明没有默认构造函数的字段
- 对象引用中的字段以不同的方法返回不同的值
- 实例化时结构字段中的默认值
- 与位字段的并集为位字段成员提供了意外值
- 使用 istream 提取运算符进行 csv 解析:如何检测缺失的字段值?
- 如何将必需的 protobuf 字段设置为其默认值?
- 无法初始化初始值设定项列表之外的字段
- Protobuf序列化长度在使用不同的字段值时会有所不同
- 我如何一遍又一遍地向用户提问,直到他们输入正确的值字段?
- 使用C 从文本行中提取字段和值
- 如何使用 stl 容器有效地存储对象?(即根据其字段的值进行搜索)
- 如何使用运算符 [] 访问结构的指定字段值
- 初始化映射的值,该映射是结构内的字段
- 将字符串转换为 XML 并使用提升更新值字段
- 为什么 MSVC 和 GCC 不能使用具有默认值的字段初始化结构
- 在C++实例中,字段不会初始化为其默认值.静态字段怎么样
- 将具有默认值的构造函数定义为组合对象的私有字段
- std::map与字符串键和自定义值字段
- 在c++中正确的对象强制转换,值字段不会改变
- Protobuf必填字段和默认值