【发布时间】:2018-08-01 07:55:23
【问题描述】:
示例代码,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 左值引用和右值引用都可以接受右值。
【问题讨论】:
-
我不认为这是一个重复的问题!首先
ClassA foo = bar(str)等价于Class foo(bar(str)); copy ctor 发生是因为您的-fno-elide-constructors和变量str不是临时对象。因此,如果您返回std::move(str),它将改为调用 move ctor。而 move ctor 发生是因为函数bar(str)返回了一个临时对象。所以这不是关于“const 左值引用和右值引用都可以接受右值”。 -
@WeiGuo 是的,这是一个重复的..我从中得到了我想要的。
标签: c++