为什么 MSVC 和 GCC 不能使用具有默认值的字段初始化结构

Why can't MSVC and GCC initialize a struct with a field with a default value

本文关键字:默认值 字段 结构 初始化 MSVC GCC 不能 为什么      更新时间:2023-10-16
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功能。