有人可以启发我在哪里找到
prvalue :
中当用作函数参数且函数的两个重载可用时,一个重载右值引用参数,另一个重载左值引用const参数,则右值绑定到重载参考重载(因此,如果复制和移动构造函数可用,一个rvalue参数调用move构造函数,同样使用copy和move赋值运算符。
答案 0 :(得分:2)
在C ++ 17标准的最终工作草案(n4659)中,可以在16.3.3 Best viable function [over.match.best]
中找到,尤其是在以下小节中:
16.3.3.2对隐式转换序列
进行排名[over.ics.rank]
3两个相同形式的隐式转换序列是 不可区分的转换顺序,除非以下情况之一 规则适用:
(3.2)-标准转换序列S1是更好的转换
(3.2.1)-S1是一个 S2的适当子序列(比较 16.3.3.1.1定义的规范形式,不包括任何左值 转型;身份转换序列被认为是 任何非身份转换序列的子序列);否则,
(3.2.2)-S1的等级优于S2或S1和S2的等级 具有相同的等级,并且可以通过 下面的段落,否则,
(3.2.3)-参考S1和S2 绑定(11.6.3)都没有引用隐式对象参数 没有引用限定符的非静态成员函数的声明,以及 S1将右值引用绑定到右值,而S2绑定左值 参考
我相信(3.2.3)适用于您的情况。
以下是一些相关示例:
int i; int f1(); int&& f2(); int g(const int&); int g(const int&&); int j = g(i); // calls g(const int&) int k = g(f1()); // calls g(const int&&) int l = g(f2()); // calls g(const int&&)