什么时候应该通过const引用选择复制省略而不是传递参数?

ama*_*jxq 9 c++ rvalue lvalue rvo c++11

可能重复:
C++ 11中的pass-by-value是否合理?

我正在读想要速度?通过价值.Dave Abrahams关于复制省略和RVO.而且我想知道为什么我们需要复制省略?

我被告知太多次你应该通过const引用传递函数参数以避免复制(我读过的几乎所有的c ++书都告诉我这个).

假设我们有两个功能:

int f1(const string &s);
int f2(string s);
Run Code Online (Sandbox Code Playgroud)

如果实际参数是右值,则在两个函数中都将避免复制.但如果实际参数是左值,则只能在f1中避免复制,而不是在f2中.那么为什么我们需要这个功能呢?

Ben*_*ley 11

如果您还需要副本,请按值传递.是否选择f1的签名或f2的签名取决于函数的内容.例如,在这种情况下,您将使用const引用:

int f1(const string& s) {
    return s.size();
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下你会通过值传递:

int f2(string s) {
    sort(s.begin(), s.end());
    s.erase(unique(s.begin(), s.end()), s.end());
    return s.size();
}
Run Code Online (Sandbox Code Playgroud)

因为替代方案是这样的:

int f2(const string& s) {
    string temp(s);
    sort(temp.begin(), temp.end());
    temp.erase(unique(temp.begin(), temp.end()), temp.end());
    return temp.size();
}
Run Code Online (Sandbox Code Playgroud)

  • @MatthieuM:但请确保将其移入会员,而不是复制.即`S(std :: string s):s(std :: move(s)){}` (2认同)