移动选定的构造函数而不是复制。 [参考标准]
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 标准中在哪里说明?