给定一个右值,为什么移动ctor比常量复制ctor更匹配
Given a rvalue, why move ctor is a better match than const copy ctor?
示例代码,C++11,-fno-elide-constructors
。
#include <iostream>
#include <string>
using namespace std;
class ClassA
{
int a, b;
public:
ClassA() = default;
ClassA(const ClassA &obj)
{
cout << "copy constructor called" << endl;
}
ClassA(ClassA &&obj) {
cout << "move ctor called" << endl;
}
};
ClassA bar(ClassA &str)
{
return str; //call copy ctor
}
int main()
{
ClassA str;
ClassA foo = bar(str); //call move ctor
return 0;
}
https://wandbox.org/permlink/DyALfRETs2LfWSjc
为什么ClassA foo = bar(str);
调用move ctor而不是copy ctor?由于常量左值引用和右值引用都可以接受右值。
const lvalue
引用可以绑定到所有内容,因此,如果编译器更喜欢rvalue
引用,那么如果提供copy构造函数,就永远不会调用move构造器,这将破坏同时拥有两者的目的。
接受function
的rvalue
引用是更通用的接受const lvalue
引用的更专业的版本,编译器总是选择最专业的版本。
相关文章:
- 给定一个右值,为什么移动ctor比常量复制ctor更匹配
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- 为什么当我不移动任何东西时,clang 会抱怨删除移动 ctor?
- 相同指令的输出不同 - 移动并复制CTOR
- 复制ctor被称为而不是移动ctor-可以编译器发出警告
- 为什么移动 ctor 比复制 ctor 慢?
- 当使用三元运算符并删除移动/复制CTOR时,Visual Studio不执行RVO
- 自 C++17 以来,复制 elision 不需要存在和访问复制或移动 CTOR
- 转换和移动 ctor 导致对 Clang 和 GCC 4.9.2 的模棱两可的要求
- 析构函数是移动ctor/赋值的RHS上唯一调用过的东西吗
- 移动类的数组成员所需的ctor
- 移动具有常量数据成员或引用成员的类的ctor
- 用于包装unique_ptr的模板化移动 ctor
- 为什么要删除基类的默认复制并移动ctor和赋值
- 移动 ctor 是否在所有情况下都有效
- 当使用类型为"类&&"的变量作为参数时,为什么调用复制 ctor 而不是移动 ctor
- C++11:调用移动 ctor/operator= 时
- 使用移动 CTOR 的 constexpr 对象的 constexpr 数组
- 返回带有已删除移动/复制 ctor 的类型临时
- 显式移动 ctor 是否消除了隐式复制 ctor