避免非const引用形参

Avoid non-const reference parameters

本文关键字:引用 形参 const      更新时间:2023-10-16

我遇到了这个输出参数约定,它更倾向于指针而不是引用。

"在函数形参列表中,所有引用必须为const:

void Foo(const string &in, string *out);

实际上,在Google代码中,输入参数是值或const引用,而输出参数是指针,这是一个非常强大的约定。输入形参可以是const指针,但绝不允许使用非const引用形参,除非约定需要,例如swap()。"

这似乎与这个问题的公认答案有些不同,后者认为应该使用引用,除非函数涉及一些指针运算。

所以我想知道这个input param is const reference, output param is pointer是否只是谷歌风格的问题,或者它是一个更普遍接受的实践(避免非const引用参数)

您没有提到这种编码实践的基本原理。我所知道的主要原因是,当你扫视一段代码时,它能让你更清楚地看到写的是什么。即使你不记得每个被调用的函数都做了什么,你仍然可以知道变量什么时候被修改了,因为你会看到它的地址被传递。

另外,改变一个函数有时会修改它的一个参数,这不会无声地破坏其他代码。你必须去每个呼叫点,按指针调用。您可能会注意到,如果其中一个调用站点需要您而不是更改该参数。

我不能说这个惯例有多被广泛采用或喜爱,但就我所知,这就是它背后的原因。

它可能会导致编译器输出稍微不太理想。按引用调用意味着调用者可以假设只修改了实际变量,而没有对同一数组的其他元素进行指针算术修改。(除非进行跨文件编译,否则编译器无法知道指向被调用函数的指针arg没有被视为数组。)