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():: WorkItem&&)
source_file.cpp:4:10:注意:参数1从'int'到'main():: WorkItem&&'
没有已知的转换
或MSVC:
source_file.cpp(9):错误C2440:'初始化':无法转换为'初始化列表' to' main :: WorkItem'
source_file.cpp(9):注意:没有构造函数可以采用源类型,或者构造函数重载决策是不明确的
从标准的角度来看,Clang是否错误地编译了此代码,或者MSVC和GCC是否错误?
另外,为什么删除= 0
允许GCC和MSVC编译? E.g。
int main() {
struct WorkItem {
int node;
unsigned predecessorIndex = 0;
};
auto x = WorkItem { 0 };
return 0;
}
海湾合作委员会版本:4.9.3 Clang版本:3.7.0 MSVC版本:19.00.24215.1
答案 0 :(得分:4)
GCC版本:4.9.3
使用默认成员初始化程序进行聚合初始化是GCC does not support until GCC 5.x的C ++ 14功能。
MSVC版本:19.00.23506
我相信这是VC 2015的Update 1.使用默认成员初始值设定项的聚合初始化是VC doesn't support until 2017的C ++ 14特性。