【发布时间】:2017-04-24 14:29:18
【问题描述】:
C++11 引入了右值引用的新概念。我在某处阅读它并发现以下内容:
class Base
{
public:
Base() //Default Ctor
Base(int t) //Parameterized Ctor
Base(const Base& b) //Copy Ctor
Base(Base&& b) //Move Ctor
};
void foo(Base b) //Function 1
{}
void foo(Base& b) //Function 2
{}
int main()
{
Base b(10);
foo(b); -- Line 1 (i know of ambiquity but lets ignore for understanding purpose)
foo(Base()); -- Line 2
foo(2) ; -- Line 3
}
现在我的理解有限,我的观察如下:
第 1 行将简单地调用复制构造函数,因为参数是左值。
C++11 之前的第 2 行将调用复制构造函数和所有那些临时复制的东西,但定义了移动构造函数,将在此处调用。
第 3 行将再次调用移动构造函数,因为第 2 行将隐式转换为基本类型(右值)。
如果以上观察有误,请指正并说明。
现在,这是我的问题:
我知道一旦我们移动一个对象,它的数据就会在调用位置丢失。因此,我在上面的示例中如何更改第 2 行以在 foo 中移动对象“b”(是否使用 std::move(b) ?)。
我读过移动构造函数比复制构造函数更有效。如何?我只能想到在移动构造函数的情况下我们在堆上有内存不需要再次分配的情况。当我们在堆上没有任何内存时,这句话是否成立?
它是否比通过引用传递更有效(不是,对吗?)?
【问题讨论】:
-
您的特定示例没有数据成员,因此 所有 这些选项可以什么都不做,并且仍然可以正常运行(“as-if”规则)