26 April 2022

C++ 核心指南目录

F.17: For “ in-out ” parameters, pass by reference to non-const

理由

以非 const 引用的方式传递参数,表示函数会修改该参数。

例子

void update(Record& r);  // assume that update writes to r

注意

有些用户自定义的类型和标准库类型的拷贝成本比较低,可以通过值传递给参数。比如span<T>iterator 。这也意味着,这些参数是以可变的入参 - 出参的机制传递。

void increment_all(span<int> a)
{
  for (auto&& e : a)
    ++e;
}

注意

T& 参数能传入数据,也能传出数据。所以T&可以作为“出参入参”使用。不过可能导致一些错误:

void f(string& s)
{
    s = "New York";  // non-obvious error
}
void g()
{
    string buffer = ".................................";
    f(buffer);
    cout << buffer << endl;
    string buffer2 = ".";  // size is too short
    f(buffer2);
    cout << buffer2 << endl;
}
int main()
{
    g();
    return 0;
}
New York
New York

这里,函数g()提供 bufferf() 填充,但是f()只是简单的把它替换掉。有一个潜在的逻辑层错误,比如g()函数的程序员可能错误假定 buffer 的长度。

强化

  • (适中)(基础)函数用了非常量引用,却没有往参数写东西。警告。
  • (简单)(基础)函数移动了非常量引用。警告。