给定一个右值,为什么移动ctor比常量复制ctor更匹配

Given a rvalue, why move ctor is a better match than const copy ctor?

本文关键字:ctor 移动 常量 复制 为什么 一个      更新时间:2023-10-16

示例代码,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构造器,这将破坏同时拥有两者的目的。

接受functionrvalue引用是更通用的接受const lvalue引用的更专业的版本,编译器总是选择最专业的版本。