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

时间:2016-12-27 15:44:39

标签: c++ gcc visual-c++ clang language-lawyer

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

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特性。