给定一个右值,为什么move ctor比const copy ctor更匹配?

时间:2018-08-01 07:55:23

标签: c++

示例代码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左值引用和右值引用都可以接受右值。

1 个答案:

答案 0 :(得分:0)

const lvalue引用可以绑定到所有内容,因此,如果编译器比rvalue引用更喜欢它,则 move 构造函数将永远不会被调用。 提供了构造函数,这将破坏同时拥有两者的目的。

接受rvalue的{​​{1}}引用是更通用的function接受的引用的更专业的版本,并且编译器始终选择最专门的版本。