首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++20中概念化的“运算符自动”

问C++20中概念化的“运算符自动”
EN

Stack Overflow用户
提问于 2021-07-30 21:13:58
回答 1查看 754关注 0票数 18

从C++20开始,我们可以在auto关键字前面加上概念的名称,以限制可能的类型。尤其是在类转换operator auto中,这种组合是可能的。

代码语言:javascript
复制
template <typename T> concept x = true;

struct S
{
    operator x auto() { return 2; }
    operator auto() { return 1; }
};

int main() { return S{}.operator x auto(); }

但是Clang是唯一接受整个程序的编译器,但是main()返回1 (而不是我所期望的2 ),演示:https://gcc.godbolt.org/z/b16jYGa81

GCC接受了结构化定义,但拒绝编译S{}.operator x auto()。

即使是struct S,MSVC也拒绝接受错误:

代码语言:javascript
复制
error C2535: 'S::operator auto(void)': member function already defined or declared

只是想知道,哪个编译器就在这里(如果有的话)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-30 21:22:31

这一转换功能:

代码语言:javascript
复制
operator auto() { return 1; }

表示与此转换函数完全相同的意思:

代码语言:javascript
复制
operator int() { return 1; }

我们从1推断返回类型,这不是一个函数模板。

这一转换功能:

代码语言:javascript
复制
operator x auto() { return 2; }

意思大致与以下几点相同:

代码语言:javascript
复制
operator int() { static_assert(x<int>); return 2; }

我们从2推导返回类型,并确保该类型(int)满足特定的概念(x)。

将两者结合起来,我们有两个函数(都不是函数模板),这两个函数都被命名为operator int(),这是不允许的。这应该是不正确的,即使在声明的点,因为名称operator int()是绑定到两个冲突的声明。

请注意,第二个名称仍然是operator int(),而不是operator x auto()。

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

https://stackoverflow.com/questions/68597160

复制
相关文章

相似问题

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