我对这个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;
}它与GCC 10在C++20标准(但不是在C++17标准中)和最新的MSVC编译,但不使用clang 13或14,甚至在C++20。
根据标准(来自优先选择),至少在指定模板类型时应该可以实例化Foo。
为什么这与C++20有关?我在模板演绎规范中没有看到任何变化(我可能遗漏了什么)。
另外(这很奇怪),GCC在C++20模式下甚至在调用Foo时不指定模板类型(Foo(0))就编译。
哥德波特链接 这里
发布于 2021-12-07 13:46:45
它是用GCC 10编写的C++20标准(但不是C++17标准)和最新的MSVC。
这是因为GCC 10和最新的MSVC实现了允许从括号大小的值列表初始化聚合。,它允许我们使用括号来初始化聚合。
另外(这很奇怪),GCC在C++20模式下甚至在调用Foo时不指定模板类型(
Foo(0))就会编译。
这是因为GCC 10实现了聚合类模板参数的演绎,这使得T自动推导成int。
请注意,clang目前没有实现这两个C++20特性,所以您的代码不能被clang接受。
您可以参考优先选择来获得当前编译器对C++20特性的支持。
发布于 2021-12-07 13:41:31
关于您的链接,编译器将告诉您调用有什么问题:
错误:对'Foo::Foo(int)‘的调用没有匹配函数
因此,问题在于您试图调用一个不存在的构造函数。类Foo仅具有默认构造函数Foo()。
只需将return Foo<int>(0).value;更改为return Foo<int>().value;就可以了。否则,您将需要像Foo(T) {}这样的构造函数。
https://stackoverflow.com/questions/70260994
复制相似问题