平凡类型的可构造性

  • 本文关键字:类型 c++ c++17 c++20
  • 更新时间 :
  • 英文 :


关于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中没有它就不能工作。

最新更新