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
.
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
.