【发布时间】:2020-03-27 06:44:54
【问题描述】:
struct any
{
template <typename T>
operator T &&() const;
template <typename T>
operator T &() const;
};
int main()
{
int a = any{};
}
这里的第二个转换运算符是由重载决议选择的。为什么?
据我了解,这两个运算符分别推导出为operator int &&() const和operator int &() const。两者都在一组可行的功能中。通读 [over.match.best] 并没有帮助我弄清楚为什么后者更好。
为什么后者的功能比前者好?
【问题讨论】:
-
我是一只普通的猫,我会说它必须是第二只猫,否则它的引入将是 C++11 中的重大变化。它会在某个地方成为标准。不过,好问题,请投赞成票。 (注意专家:如果这个评论是废话,请告诉我!)
-
FWIW,
template <typename T> operator T &&() const &&; template <typename T> operator T &() const &;让它调用第一个。 -
@LightnessRaceswithMonica 转换运算符允许这样做,否则将无法拥有多个转换运算符。
-
@Bathsheba 我认为这不是原因。这就像说重载决议永远不能选择移动构造函数,因为这将是一个重大更改。如果您编写移动构造函数,则您选择让您的代码被该定义“破坏”。
-
@LightnessRaceswithMonica 我将其牢记在心的方式是将返回类型视为函数的名称。不同的类型等于不同的名称等于成功:)
标签: c++ language-lawyer c++17 overload-resolution