问题描述
据我所知,以下程序应该可以在 C++20 模式下运行:
#include <vector>
struct B{ int a0,a1; };
int main()
{
std::vector<B> bs;
bs.emplace_back( 0,0 );
}
它在 Visual Studio 2019 和 gcc 11 中确实如此。但在 clang 12 中却没有,这会产生错误:
/opt/compiler-explorer/gcc-snapshot/lib/gcc/x86_64-linux-gnu/12.0.0/../../../../include/c++/12.0.0/bits/alloc_traits.h:514:4: error: no matching function for call to 'construct_at'
std::construct_at(__p,std::forward<_Args>(__args)...);
^~~~~~~~~~~~~~~~~
在线编译器:https://gcc.godbolt.org/z/GzccTWc5z
这是因为clang还不完全支持C++20吗?
解决方法
这是一个 C++20 特性,允许通过标准构造函数语法进行聚合初始化,而不是典型的花括号列表初始化语法。 (请注意,这仅适用于无法在对默认或复制/移动构造函数的有效调用中使用参数的情况。如果可以,则将调用该函数而不是执行聚合初始化。)
根据官方 C++ Support in Clang 页面,Clang 尚不支持聚合的括号初始化(即 P0960R3 和 P1975R0)。这是从 Clang 版本 13 开始的。
还维护了 C++20 功能的支持矩阵on cppreference.com。这说明对P0960R3的支持如下:
- GCC:从版本 10 开始支持
- MSVC:从 19.28 版开始支持
- EDG eccp:从 5.1 版开始支持
- Clang 和 Apple Clang:不受支持
- 英特尔 ICC:不受支持