CppCoreGuidelines F.17 输入输出参数,通过非 const 引用传递
26 April 2022
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()
提供 buffer
给 f()
填充,但是f()
只是简单的把它替换掉。有一个潜在的逻辑层错误,比如g()
函数的程序员可能错误假定 buffer
的长度。
强化
- (适中)(基础)函数用了非常量引用,却没有往参数写东西。警告。
- (简单)(基础)函数移动了非常量引用。警告。