Clang和G++在处理const对象时的差异

discrepancy between clang and g++ in dealing with const objects

本文关键字:对象 const G++ 处理 Clang      更新时间:2023-10-16

考虑代码:

struct Foo
{
    int x = 10;
};
int main()
{
    const Foo foo;
}

它在 g++ http://coliru.stacked-crooked.com/a/99bd8006e10b47ef 下编译,但在 clang++ http://coliru.stacked-crooked.com/a/93f94f7d9625b579 下出现错误:

error: default initialization of an object of const type
      'const Foo' requires a user-provided default constructor

我不确定谁在这里。为什么我们需要一个默认的 ctor,因为我们执行类内初始化?

类类型的对象只有在具有用户提供的默认构造函数时才能进行默认初始化。从 [dcl.init]/7:

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

您的类Foo没有这个;大括号或等于初始值设定项的存在不会创建用户提供的默认构造函数。相反,您的类具有隐式定义的默认构造函数,其操作包含大括号或等于初始值设定项请求的初始化。(叮当是对的。

([dcl.fct.def.default],特别是第5款,涉及"用户提供的"、"明确默认"、"默示声明"和"定义为删除"的定义。整个部分都值得了解。

顺便说一下,在 C++11 中很容易避免默认初始化:

const Foo foo {};  // hunky-dory

clang 根据 8.5 [dcl.init] 第 7 段最后一句似乎是对的:

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

显然,该类型没有用户提供的默认构造函数。