【问题标题】:Clang Compile error with default initialization [duplicate]使用默认初始化的 Clang 编译错误 [重复]
【发布时间】:2015-02-05 06:59:04
【问题描述】:

考虑以下示例:

#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;
}

See Live example

这个用g++编译但是用clang++编译不出来,用下面的命令试试:clang++ -std=c++11 -O0 main.cpp &amp;&amp; ./a.out

clang 编译错误:

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

我从This Stack Overflow Question 了解到,非 POD 类获得默认构造函数。这在这里甚至没有必要,因为该变量具有 c++11 风格的默认初始化

为什么这不适合clang? 为什么A() = default; 也不起作用?

【问题讨论】:

    标签: c++ c++11 clang++


    【解决方案1】:

    这在CWG issue #253 中得到解决,它讨论了对于空对象或子对象已完全初始化的对象(在您的示例中就是这种情况)需要用户提供的构造函数。

    引用部分链接问题

    2011 年 8 月会议记录:

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

    从技术上讲,这是一个活跃的问题,但鉴于该注释,它似乎很可能会按照 gcc 选择实施它的方式得到解决。

    另一方面,Clang 拥有chosen to wait,直到问题得到解决,然后再实施解决方案。

    在 Clang 中,我们正在等待问题真正得到解决,然后再采取行动。

    因此,就目前而言,clang 是正确的。

    【讨论】:

    • 我认为这个帖子应该作为remyabel建议的副本关闭;也许也可以在该线程上发布您的答案
    • @MattMcNabb Potatoswatter 在另一个线程上的回答比我的更全面,所以我不想为此添加噪音。
    【解决方案2】:

    您自己引用了答案。在您链接的 SO 答案中,有来自标准的以下引用(第 6.8.6 节):

    如果一个程序调用一个对象的默认初始化 const 限定类型 T,T 应是具有 用户提供 的类类型 默认构造函数。

    强调我的。线

    A() = default;
    

    显然不提供构造函数,它通过告诉编译器您不想提供构造函数来做相反的事情,因此您的代码无法编译。但是,一旦您通过取消注释来提供构造函数

     A(){}; 
    

    它工作正常。因此,总而言之,clang 显示的错误是符合标准的,而 gcc 的行为可能是一个错误。

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 2017-02-27
      • 1970-01-01
      • 2019-02-27
      • 2012-05-10
      • 2020-08-11
      相关资源
      最近更新 更多