我应该何时提供移动感知过载?

Bar*_*uch 1 c++ move-semantics c++11

如果我有一个管理一些动态内存的类(例如矢量类型)并且它已经有一个移动构造函数,为函数提供移动感知重载是否有意义,或者移动构造函数是否有意义照顾它?

例如,我应该使用Class&&变量重载哪些(如果有的话):

// the move-aware overload for all of these would be
// void FuncX(Class&&);

void Func1(Class);

void Func3(Class&); // doesn't make a local copy
void Func4(Class&); // makes a local copy

void Func5(Class const);

void Func7(Class const&); // doesn't make a local copy
void Func8(Class const&); // makes a local copy
Run Code Online (Sandbox Code Playgroud)

他们中的任何一个都失去了优化机会,因为我没有提供移动感知变体吗?

Jon*_*ely 5

Func1并且Func5具有相同的签名,并且已经"移动感知",因为可以使用左值或右值调用它们,并且可以在传递右值时构造参数.

Func3并且Func4目前不能用rvalues调用,重载它们Func(Class&&)将是语义的重大变化,而不仅仅是优化.

Func7 已经可以用rvalues调用,没有什么可以通过复制或移动进行初始化,重载它将是毫无意义的.

Func8可以使用rvalues调用但执行复制,将该函数更改为Func8(Class)使用副本或移动初始化参数,具体取决于是使用左值还是右值调用.或者,重载它Func8(Class&&)也可以让你在传递右值时避免复制,但现在你有两个要维护的功能.