首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有聚合类型的自动模板演绎C++20

具有聚合类型的自动模板演绎C++20
EN

Stack Overflow用户
提问于 2021-12-07 13:29:05
回答 2查看 226关注 0票数 11

我对这个C++代码感到困惑:

代码语言:javascript
复制
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))就编译。

哥德波特链接 这里

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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特性的支持。

票数 8
EN

Stack Overflow用户

发布于 2021-12-07 13:41:31

关于您的链接,编译器将告诉您调用有什么问题:

错误:对'Foo::Foo(int)‘的调用没有匹配函数

因此,问题在于您试图调用一个不存在的构造函数。类Foo仅具有默认构造函数Foo()

只需将return Foo<int>(0).value;更改为return Foo<int>().value;就可以了。否则,您将需要像Foo(T) {}这样的构造函数。

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70260994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档