Sté*_*nel 11 c++ templates c++20 aggregate-type
我对这段 C++ 代码感到困惑:
template <class T>
struct Foo {
T value;
};
int main() {
return Foo<int>(0).value;
// Below code works as well in gcc
// return Foo(0).value;
}
Run Code Online (Sandbox Code Playgroud)
它使用 C++20 标准中的 GCC 10(但不是 C++17 标准)和最新的 MSVC 进行编译,但不能使用 clang 13 或 14 进行编译,即使在 C++20 中也是如此。
根据标准(来自cppreferenceFoo ),至少在指定模板化类型时应该可以实例化。
为什么这与 C++20 有关?我在模板推导规范中没有看到任何变化(我可能错过了一些东西)。
另外(这很奇怪),当我们调用Foo而不指定模板类型(Foo(0))时,C++20 模式下的 GCC 甚至可以编译。
神电链接 在这里
它使用 C++20 标准(但不是 C++17 标准)的 GCC 10 和最新的 MSVC 进行编译。
这是因为 GCC 10 和最新的 MSVC 实现允许从带括号的值列表初始化聚合,这允许我们使用括号来初始化聚合。
另外(这很奇怪),当我们调用 Foo 而不指定模板类型(
Foo(0))时,C++20 模式下的 GCC 甚至可以编译。
这是因为 GCC 10 实现了聚合的类模板参数推导,这使得T自动推导为int。
请注意,clang 目前没有实现这两个 C++20 功能,因此 clang 无法接受您的代码。
您可以参考cppreference来获取当前编译器对 C++20 功能的支持。