选择移动构造方法,而不是复制。 [参考标准]

时间:2019-05-16 08:42:49

标签: c++ language-lawyer c++17

有人可以启发我在哪里找到

prvalue

  

当用作函数参数且函数的两个重载可用时,一个重载右值引用参数,另一个重载左值引用const参数,则右值绑定到重载参考重载(因此,如果复制和移动构造函数可用,一个rvalue参数调用move构造函数,同样使用copy和move赋值运算符。

来自cppreference

standard here

1 个答案:

答案 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&&)