C++ 中的 'operator auto' 是什么?

What is 'operator auto' in C++?

Clang and Visual Studio compilers (but not GCC)允许编写如下代码:

struct A
{
  operator auto() { return 0; }
};

int main()
{
   A a;
   a.operator auto();
}

什么是operator auto?它是特定编译器的扩展还是标准语言功能,如果是,它出现在什么语言标准(例如 C++17)中?

当在 user-defined conversion function 中使用 auto 时,将通过 return 类型推导来推导类型,即本例中的 int (0)。这是在 C++14 中引入的。

The placeholder auto can be used in conversion-type-id, indicating a deduced return type:

struct X {
    operator int(); // OK
    operator auto() -> short;  // error: trailing return type not part of syntax
    operator auto() const { return 10; } // OK: deduced return type
};

它是标准的,来自 C++14,如您所见here

简而言之,就是根据return语句通过类型推导确定return类型。

换句话说,下面代码段中的三个auto触发相同的类型推导机制

struct A
{
  auto operator()() { return 0; } // auto is the return type
  auto some_fun() { return 0; }   // auto is the return type
  operator auto() { return 0; }   // auto is not the return type
                                  // but it's deduced in the same way
};

因此,您对 auto return 类型的其他函数所期望的所有 requirements/limitations 在这里也适用,例如如果存在多个 return 语句,它们应该导致推导相同的类型,依此类推。

What is operator auto in C++?

operator auto() { return 0; }

operator T 是类型 T 的转换运算符。 auto 是将被推导的占位符类型的关键字。当用作return类型时,该类型将从return语句中扣除。

在这种情况下,auto 将被推断为 int,因此它是 int 的隐式转换运算符。它允许您编写例如:

A a;
int i = a;

in what language standard (e.g. C++17) did it appear?

转换运算符至少从第一个标准版本开始就已经在语言中了。 auto return 类型是在 C++14 中引入的。


a.operator auto();

编译器似乎不同意如何显式调用运算符:

a.operator auto(); // Clang: OK,    GCC: ERROR
a.operator int();  // Clang: ERROR, GCC: OK

这可能在语言中未指定。

我认为没有理由进行这样的调用,因为您可以使用 static_cast 代替,因此我建议避免使用它。或者,如果您更喜欢使用调用语法,则不要使用 auto.