Clang和G++在处理const对象时的差异
discrepancy between clang and g++ in dealing with const objects
考虑代码:
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 限定类型的对象的默认初始化
T
,T
应是具有用户提供的默认构造函数的类类型。
您的类Foo
没有这个;大括号或等于初始值设定项的存在不会创建用户提供的默认构造函数。相反,您的类具有隐式定义的默认构造函数,其操作包含大括号或等于初始值设定项请求的初始化。(叮当是对的。
([dcl.fct.def.default],特别是第5款,涉及"用户提供的"、"明确默认"、"默示声明"和"定义为删除"的定义。整个部分都值得了解。
顺便说一下,在 C++11 中很容易避免默认初始化:
const Foo foo {}; // hunky-dory
clang 根据 8.5 [dcl.init] 第 7 段最后一句似乎是对的:
如果程序调用
const
限定类型的对象的默认初始化T
,则T
应是具有用户提供的默认构造函数的类类型。
显然,该类型没有用户提供的默认构造函数。
相关文章:
- 被解释为低级别const的const对象的地址
- 使用共享指针的函数调用,其对象应为 const
- 如何从构造函数副本 T(const T&)调用对象 T?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- "this"指向的对象是否与 const 对象相同?
- const auto & 和 auto & if reference 对象之间的区别是 const
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- 为什么 const YAML::Node 对象的行为不像 yaml-cpp 中的类似值的对象?
- 从 const 对象访问非 const 方法
- 将非 const 对象用于 const 参数
- 如何键入用于const对象的自定义io操纵器
- 对临时对象的Const引用不会延长其生存期
- 正在通过const-ref未定义的行为捕获新构造的对象
- 具有成员变量的对象 Const 数组 = 先前索引成员变量的总和
- 为什么我构建的临时对象const不可变
- 强制用户声明对象const