这是风格问题。在谷歌(参见Google C++ 风格指南 http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml),则优先选择以下内容:
bool CalculateSomeValue(
const vector<string>& input, map<string, double>* result);
这是因为使用指针需要在调用站点显式使用 & 符号:
CalculateSomeValue(input, &result);
与使用引用类型调用它的方式相反:
CalculateSomeValue(input, result);
通过在修改参数的情况下强制使用 & 符号,调用站点将清楚会发生什么。使用引用时,有必要查找每个函数的文档,以了解它是否有可能修改其输入参数。
然而,使用指针也有其缺点。特别是,使用指针意味着您将处理 null 的责任从调用者(其中指针将被取消引用)(如果变量是指针而不仅仅是具有局部变量的地址表达式)转移到函数。也就是说,当使用指针类型时,CalculateSomeValue
需要检查nullptr
(或者需要清楚地记录它需要在调用者中进行此检查),而引用类型的使用是自记录的,并且清楚地表明需要非空引用。
对于这种特殊情况,我个人强烈推荐采用混合方法:
bool CalculateSomeValue(
const std::vector<std::string>& input,
Output<map<string, double>> result);
... 在哪里Output<T>
由具有签名的函数创建:
template<typename T> Output<T> WriteTo(T& output_ref);
...以及在哪里Output<T>
重载运算符->
, *
等等。这基本上迫使调用站点变得明确,因为输入将通过要求进行改变:
CalculateSomeValue(input, WriteTo(result));
...相对于:
CalculateSomeValue(input, result);
...同时获得引用的非空语义/语法。