我应该通过std :: function by-value还是通过(rvalue)-reference?

rus*_*tyx 8 c++ c++11

我不太明白std::function实际包含的实例是什么.

通过按值或按引用传递它是否更有效?

以下示例中的性能影响是什么?

通过值:

void printStats(std::function<void(const char *)> printer);
. . .
std::string tmp;
printStats([&tmp](const char * msg){ tmp += msg; });
Run Code Online (Sandbox Code Playgroud)

通过rvalue-reference:

void printStats(std::function<void(const char *)>&& printer);
. . .
std::string tmp;
printStats([&tmp](const char * msg){ tmp += msg; });
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 7

首先,std::function要求在目标是函数指针的情况下避免分配std::reference_wrapper; 鼓励实施以避免分配"小"目标:

[...]例如,其中f目标是仅包含对象的指针或引用的对象以及成员函数指针.

这意味着复制std::function其目标很大的将涉及目标的分配和副本(不允许引用计数,因为目标可能具有可变状态).但是,在您的特定情况下,由于您使用prvalue临时调用函数,因此将省略该副本.

在您的特定情况下,由于您正在立即调用该函数,因此您无需担心取得它的所有权,因此最好通过const引用来获取该函数.通过右值引用来获取它将使具有现有左值或const引用函数的用户感到头疼; 他们需要std::move它(在前一种情况下)或创建一个prvalue临时副本(在后一种情况下).