考虑以下示例:
#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
从c编译错误:
main.cpp:19:13:错误:常量类型'const A'的对象的默认初始化需要用户提供的默认构造函数
我从“堆栈溢出问题”中学到了,非POD类将获得默认构造函数。这里甚至没有必要,因为变量具有c ++ 11样式的默认初始化
为什么不为c呢?为什么也A() = default;
行不通?
您自己引用了答案。在您链接的SO答案中,以下是标准引用的内容(准确地是6.8.6节):
如果程序要求对const限定类型T的对象进行默认初始化,则T必须是具有用户提供的默认构造函数的类类型。
强调我的。线
A() = default;
显然没有提供构造函数,相反,它告诉编译器您不想提供构造函数,因此您的代码无法编译。但是,一旦通过取消注释提供了构造函数
A(){};
它工作正常。因此,总而言之,clang显示的错误是按标准的,并且gcc的行为可能是一个错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句