Clang Compile错误,默认初始化
Clang Compile error with default initialization
考虑以下示例:
#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;
}
参见实时示例
这确实使用g++编译,但不使用clang++编译,尝试使用以下命令:clang++ -std=c++11 -O0 main.cpp && ./a.out
clang编译错误:
main.cpp:19:13:错误:const类型"const A"的对象的默认初始化需要用户提供的默认构造函数
我从这个堆栈溢出问题中学到,非POD类获得默认构造函数。这在这里甚至没有必要,因为变量具有c++11风格的默认初始化
为什么这不是为了叮当?为什么A() = default;
也不起作用?
这在CWG第253期中得到了解决,该期讨论了为空对象或子对象已完全初始化的对象(在您的示例中就是这样)提供用户提供的构造函数的必要性。
引用关联问题的一部分
2011年8月会议纪要:
如果隐式默认构造函数初始化所有子对象,则不需要初始化器。
从技术上讲,这是一个活跃的问题,但考虑到这一点,它似乎很可能会以gcc选择的方式来解决
另一方面,Clang选择等到问题解决后再实施解决方案。
在Clang,我们正在等待问题真正得到解决,然后再采取行动
因此,就目前的情况来看,clang是正确的。
您自己引用了答案。在您链接的SO答案中,引用了标准中的以下内容(准确地说是第6.8.6节):
如果程序调用的对象的默认初始化const限定的类型T,T应为具有用户提供的类类型默认构造函数。
重点是我的。线路
A() = default;
显然,它没有提供构造函数,相反,它告诉编译器你不想提供构造函数,因此你的代码无法编译。但是,一旦您通过取消注释来提供构造函数
A(){};
它运行良好。总之,clang显示的错误是符合标准的,gcc的行为可能是一个错误。
- 使用 std::分配器在 constexpr 中进行默认初始化
- 为什么对象默认初始化,但基元不在C++?
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 默认初始化无法正常工作
- C++11默认初始化/值初始化/直接初始化
- make_shared是否对每个成员变量执行默认初始化(零初始化)
- 是否可以默认初始化具有已删除默认构造函数的类类型
- 对象成员数组C++默认初始化
- POD成员默认初始化无括号
- 如何在不使用 new 的情况下进行默认初始化
- 有没有办法欺骗 std::make_shared 使用默认初始化
- 枚举类默认初始化
- 是默认的构造函数和默认初始化
- 为什么在C 中不允许使用括号的默认初始化
- 默认初始化的含义在C 11中发生了变化
- Main()函数中的默认初始化
- WINHTTP_CURRENT_USER_IE_PROXY_CONFIG默认初始化
- 强制本地变量默认初始化
- 默认初始化混乱