移动选定的构造函数而不是复制。 [参考标准]

Posted

技术标签:

【中文标题】移动选定的构造函数而不是复制。 [参考标准]【英文标题】:Move Constructor choosen instead of Copy. [reference to std] 【发布时间】:2019-05-16 08:42:48 【问题描述】:

谁能告诉我在哪里可以找到

prvalue

当用作函数参数并且函数的两个重载可用时,一个采用右值引用参数,另一个采用左值引用到 const 参数,右值绑定到右值引用重载(因此,如果复制和移动构造函数可用,右值参数调用移动构造函数,复制和移动赋值运算符也是如此)。

来自cppreference

在standard here

【问题讨论】:

【参考方案1】:

在 C++17 标准的最终工作草案 (n4659) 中,可以在 16.3.3 Best viable function [over.match.best] 中找到它,特别是在以下小节中:

16.3.3.2 对隐式转换序列进行排序[over.ics.rank]

3 两个相同形式的隐式转换序列是 不可区分的转换序列,除非以下之一 规则适用:

(3.2) — 标准转换序列 S1 是更好的转换 序列比标准转换序列 S2 if

(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&&)

【讨论】:

以上是关于移动选定的构造函数而不是复制。 [参考标准]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在我的代码中调用复制构造函数而不是移动构造函数?

使用复制列表初始化从函数返回,不需要复制/移动构造函数 - C++ 11 标准中在哪里说明?

构造函数复制构造赋值操作移动构造移动操作

调用复制 ctor 而不是移动 ctor - 编译器可以发出警告吗?

复制构造函数中的 const 而不是 const?

C++11移动构造函数详解