C++20 中概念化的“operator auto”

18 c++ auto c++-concepts c++20

从 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(); }
Run Code Online (Sandbox Code Playgroud)

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

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

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

error C2535: 'S::operator auto(void)': member function already defined or declared
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*rry 21

这个转换函数:

operator auto() { return 1; }
Run Code Online (Sandbox Code Playgroud)

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

operator int() { return 1; }
Run Code Online (Sandbox Code Playgroud)

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


这个转换函数:

operator x auto() { return 2; }
Run Code Online (Sandbox Code Playgroud)

意思大致相同:

operator int() { static_assert(x<int>); return 2; }
Run Code Online (Sandbox Code Playgroud)

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


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

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