【发布时间】:2022-01-12 13:51:17
【问题描述】:
我对这段 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;
}
它可以使用 C++20 标准(但不是 C++17 标准)和最新的 MSVC 中的 GCC 10 编译,但不能使用 clang 13 或 14,即使在 C++20 中也是如此。
根据标准(来自cppreference),至少在指定模板类型时应该可以实例化Foo。
为什么这与 C++20 相关?我看不出模板推导规范有什么变化(我可能遗漏了一些东西)。
另外(这很奇怪),当我们调用 Foo 而不指定模板类型 (Foo(0)) 时,C++20 模式下的 GCC 甚至可以编译。
神螺栓链接 here
【问题讨论】:
-
这看起来不像聚合初始化(您在链接中引用的内容),而更像是对象构造函数调用。
-
@roccobaroccoSC C++20 允许使用括号构造聚合。
标签: c++ templates c++20 aggregate-type