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}
可构造性基于使用构造函数语法的能力 ( T(values))。在 C++20 中,聚合可以使用构造函数语法进行初始化,但在 C++17 及之前版本中,它们必须使用{}语法。
Clang 的 C++20 实现还没有达到标准。