多种转换功能作为课堂上的“operator auto”

αλε*_*λυτ 9 c++ type-conversion language-lawyer auto

在下面的代码中

struct S {
    operator auto() { return 42; }
};
Run Code Online (Sandbox Code Playgroud)

operator auto等价于operator int因为实际类型是从文字中推导出来的,42而该类型是int. 如果我写42.5而不是42thenoperator auto将被解释operator double为显而易见的原因。但是当我同时使用两者时,所有三个主要编译器(gcc、clang、msvc)都出现编译器错误:

struct S {
    operator auto() { return 42; }
    operator auto() { return 42.5; }
};
Run Code Online (Sandbox Code Playgroud)

编译器之间的实际错误消息各不相同,但原因是相同的:“函数已经定义”。

我无法在标准中找到为什么operator auto不能在一个类中同时使用两者(具有不同的返回类型)。有人可以指出标准的条款,其中该组转换函数被认为是被禁止的吗?

Fed*_*dor 1

如果你在一个类中只需要两个或三个,那么使用和 的operator auto技巧将适合你:constdecltype(auto)

#include <iostream>

struct S 
{
    operator auto() { return 42; }
    operator const auto() { return 42.5; }
    operator decltype(auto)() { return 43.5f; }
};

int main()
{
   S s;
   std::cout << (int)s << '\n';
   std::cout << (double)s << '\n';
   std::cout << (float)s << '\n';
}
Run Code Online (Sandbox Code Playgroud)

https://gcc.godbolt.org/z/hvbesaM4z

不幸的是,它不适用于超过三个不同的运算符。这是当前C++的限制。