【问题标题】:Conceptualized `operator auto` in C++20C++20 中概念化的`operator auto`
【发布时间】:2021-10-06 08:45:24
【问题描述】:

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

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()

MSVC 甚至拒绝接受 struct S 并出现错误:

error C2535: 'S::operator auto(void)': member function already defined or declared

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

【问题讨论】:

  • 显式调用运算符是一种不好的做法。转换运算符的目的是简化代码而不是使其更难阅读。

标签: c++ c++20 auto c++-concepts


【解决方案1】:

这个转换函数:

operator auto() { return 1; }

意思和这个转换函数完全一样:

operator int() { return 1; }

我们从1 推导出返回类型,这不是函数模板。


这个转换函数:

operator x auto() { return 2; }

意思大致相同:

operator int() { static_assert(x<int>); return 2; }

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


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

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

【讨论】:

  • 有这样的澄清吗? AFAIK,operator auto 周围的语言太模糊了。具体来说,它没有说明operator autooperator T 是否是正确的名称(T 是推导的类型)。
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 2021-07-12
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多