谷歌关于输入/输出参数的样式指南作为指针

sui*_*kan 10 c++ parameters reference google-style-guide cpplint

谷歌C++样式指南绘制有明显的区别(严格接着cpplint.py输入参数之间)(→常量REF,值)和输入-输出或输出参数(→非const的指针):

C/C++函数的参数既可以是函数的输入,也可以是函数的输出,或者两者兼而有之.输入参数通常是值或const引用,而输出和输入/输出参数将是非常量指针.

并进一步 :

事实上,在Google代码中,一个非常强大的约定是输出参数是值或const引用,而输出参数是指针.

但我无法弄清楚为什么不应该通过引用传递输入/输出参数(我将输出参数放在一边).在stackoverflow上有很多与这个问题相关的主题:例如,在这里,接受的答案清楚地说明了这一点

它主要是关于风格

但是如果

如果您希望能够传递null,则必须使用指针

那么,如果我想避免指针为空,总是需要一个指针是什么意思?为什么只使用输入参数的引用?

Ker*_* SB 27

要求输出参数作为指针传递的原因很简单:

在调用站点清楚表明该参数可能会发生变异:

foo(x, y);     // x and y won't be mutated
bar(x, &y);    // y may be mutated
Run Code Online (Sandbox Code Playgroud)

当代码库发展并经历由可能不了解整个上下文的人员审核的增量更改时,能够尽快了解更改的上下文和影响非常重要.因此,使用此样式规则,可以立即清楚更改是否引入了变异.


Cor*_*mer 6

他们提出的观点(我不同意)就是说我有一些功能

void foo(int a, Bar* b);
Run Code Online (Sandbox Code Playgroud)

如果b参数是可选的,或者有时是不必要的,你可以像这样调用函数

foo(5, nullptr);
Run Code Online (Sandbox Code Playgroud)

如果函数声明为

void foo(int a, Bar& b);
Run Code Online (Sandbox Code Playgroud)

然后就没有办法通过了Bar.

这一点(强调我的)完全基于意见,取决于开发人员的自由裁量权.

事实上,在Google代码中,一个非常强大的约定是输出参数是值或const引用,而输出参数是指针.

如果我打算b成为一个输出参数,以下任何一个都是完全有效和合理的.

void foo(int a, Bar* b);  // The version Google suggests
void foo(int a, Bar& b);  // Reference version, also perfectly fine.
Run Code Online (Sandbox Code Playgroud)

  • Titus似乎更倾向于呼叫站点,表明传入的内容可以在他的CppCon视频中进行修改. (2认同)