从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()。
即使是struct S,MSVC也拒绝接受错误:
error C2535: 'S::operator auto(void)': member function already defined or declared只是想知道,哪个编译器就在这里(如果有的话)?
发布于 2021-07-30 21:22:31
这一转换功能:
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()。
https://stackoverflow.com/questions/68597160
复制相似问题