关于c++ 17;GCC、Clang和MSVC考虑一个平凡的类类型而不是可由其任何数据成员类型构造。从c++ 20开始,GCC和MSVC改变了这一点,允许下面的例子编译。
#include <type_traits>
struct t {
int a;
};
static_assert(std::is_constructible<t, int>{});
不幸的是,Clang似乎不同意,在用-std=c++20
编译时也拒绝了这段代码。这是Clang的编译错误吗?为什么所有的编译器都而不是考虑像t
这样的类型在用-std=c++17
编译时可以用int
构造?毕竟,t{0}
似乎是可以这样构造的。
可构造性基于使用构造函数语法(T(values)
)的能力。在c++ 20中,聚合可以使用构造函数语法初始化,但在c++ 17及之前的版本中,聚合必须使用{}
语法。
Clang的c++ 20实现还没有达到标准。
如果您添加一个可以从int
构造t
的构造函数,Clang将编译这个。我不知道为什么在clang中没有它就不能工作。