在编写转换运算符时,如果我同时提供了对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!
但是也许说某种语言的人比我能证明的更好?
答案 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对象上调用可变方法。