Why does Clang 12 refuse to initialize aggregates in the C++20 way?(为什么Clang 12拒绝以C++20的方式初始化聚合?)
本文介绍了为什么Clang 12拒绝以C++20的方式初始化聚合?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
据我了解,以下程序应该可以在C++20模式下运行:
#include <vector>
struct B{ int a0, a1; };
int main()
{
std::vector<B> bs;
bs.emplace_back( 0, 0 );
}
在Visual Studio2019和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:不支持
这篇关于为什么Clang 12拒绝以C++20的方式初始化聚合?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:为什么Clang 12拒绝以C++20的方式初始化聚合?


猜你喜欢
- DoEvents 等效于 C++? 2021-01-01
- XML Schema 到 C++ 类 2022-01-01
- 将函数的返回值分配给引用 C++? 2022-01-01
- OpenGL 对象的 RAII 包装器 2021-01-01
- 如何提取 __VA_ARGS__? 2022-01-01
- 从父 CMakeLists.txt 覆盖 CMake 中的默认选项(...)值 2021-01-01
- 使用 __stdcall & 调用 DLLVS2013 中的 GetProcAddress() 2021-01-01
- 将 hdc 内容复制到位图 2022-09-04
- 哪个更快:if (bool) 或 if(int)? 2022-01-01
- GDB 不显示函数名 2022-01-01