在可能的情况下,C ++是否会始终首选右值引用转换运算符而不是const左值引用?

时间:2018-08-08 20:07:14

标签: c++ c++11

在编写转换运算符时,如果我同时提供了对const T&T&&的转换,那么C ++在可能的情况下会始终喜欢使用rvalue运算符吗?在这个小测试中,这似乎是正确的:

#include <algorithm>
#include <stdio.h>

struct holds {
  operator       int&&()      { printf("moving!\n");  return std::move(i); }
  operator const int&() const { printf("copying!\n"); return i;            }

private:
  int i = 0;
};


int main() {
  holds h;
  int val = h;
}

打印:

 ╰─▸ ./test
moving!

但是也许说某种语言的人比我能证明的更好?

2 个答案:

答案 0 :(得分:7)

没有这样的偏好。

您的示例实际上显示了当在非const对象上调用非const成员函数时,其优先于const成员。

答案 1 :(得分:2)

因此,我没有精力和时间将自己埋在这个标准中。我相信有人会。

但是我想指出您的假设是错误的。而且您缺少了一项关键信息:一个运算符是const,一个不是,而事实证明这是决定性因素,而不是&&const &。让我们看看:

两个方法都是可变的,可变的对象:

operator       int&&();
operator const int&() ;
holds h;
int val = h; // compile error

给出错误:

  

从“保留”到“ int”的转换含糊不清

因此您会看到两个转换运算符都是等于,并且都不是首选,因此存在歧义。

这两个方法都是可变的,常量对象:

operator       int&&();
operator const int&() ;
const holds h;
int val = h;   // error no viable method

这是一个简单而有趣的方法:不能在const对象上调用任何可变方法

&&可变,const& const,对象可变

operator       int&&();
operator const int&() const;
holds h;
int val = h; // calls holds::operator int&&()

现在首选使用可变方法,因为对象是可变的

&&可变,const& const,对象const

operator       int&&();
operator const int&() const;
const holds h;
int val = h;   // calls  holds::operator int const&() const

现在const方法是唯一的选择,因为不能在const对象上调用可变方法。