示例代码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左值引用和右值引用都可以接受右值。
答案 0 :(得分:0)
const lvalue
引用可以绑定到所有内容,因此,如果编译器比rvalue
引用更喜欢它,则 move 构造函数将永远不会被调用。 提供了构造函数,这将破坏同时拥有两者的目的。
接受rvalue
的{{1}}引用是更通用的function
接受的引用的更专业的版本,并且编译器始终选择最专门的版本。