为什么 std::is_constructible 对于普通聚合类型不成立?

303*_*303 7 c++ language-lawyer aggregate-initialization 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>{});
Run Code Online (Sandbox Code Playgroud)

不幸的是,Clang 在编译时似乎不同意并拒绝这段代码-std=c++20。这是 Clang 的编译器错误吗?为什么所有编译器在编译时t考虑可以使用 an 构造的类型?毕竟,这样似乎很容易构建。int-std=c++17t{0}

Nic*_*las 4

可构造性基于使用构造函数语法的能力 ( T(values))。在 C++20 中,聚合可以使用构造函数语法进行初始化,但在 C++17 及之前版本中,它们必须使用{}语法。

Clang 的 C++20 实现还没有达到标准。