Clang Compile错误,默认初始化

med*_*106 4 c++ c++11 clang++

考虑以下示例:

#include <iostream>
#include <type_traits>

struct A
{
  //A() = default; // does neither compile with, nor without this line
  //A(){};         // does compile with this line
  int someVal{ 123 };


  void foobar( int )
  {
  };
};


int main()
{
    const A a;
    std::cout << "isPOD = " << std::is_pod<A>::value << std::endl;
    std::cout << "a.someVal = " <<a.someVal << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

查看实例

这可以用g ++编译,但不能用clang ++编译,尝试使用以下命令: clang++ -std=c++11 -O0 main.cpp && ./a.out

从clang编译错误:

main.cpp:19:13:错误:const类型'const A'对象的默认初始化需要用户提供的默认构造函数

我从这个Stack Overflow问题中了解到,非POD类获得默认构造函数.这甚至不是必需的,因为变量具有c ++ 11样式的默认初始化

为什么这不是为了铿锵?为什么不起作用A() = default;

Pra*_*ian 5

这在CWG问题#253中讨论,该问题讨论了对于空对象或其子对象已完全初始化的对象(在您的示例中就是这种情况)的用户提供的构造函数的需求.

引用链接问题的一部分

2011年8月会议记录:

如果隐式默认构造函数初始化所有子对象,则不需要初始化程序.

从技术上讲,这是一个活跃的问题,但考虑到这一点,它似乎可以通过gcc选择实现它的方式来解决.

另一方面,Clang 选择在实施解决方案之前等待问题得到解决.

在Clang,我们正在等待问题实际得到解决,然后才能对其进行指导.

所以,就目前而言,铿锵是正确的.