【发布时间】:2013-11-17 00:38:17
【问题描述】:
如果您要查看这段代码,
int x = 0;
function(x);
std::cout << x << '\n';
您将无法通过任何语法方式验证参数 x 是通过引用传递还是通过值传递。您确定的唯一方法是查看函数声明或函数定义。
这是一个简单的例子,说明我认为这可能是一个问题:
std::string Lowercase(std::string str); //<- this is hidden away in code; probably in a different file.
int main(){
std::string str = "HELLO";
Lowercase(str);
std::cout << str << '\n'; //<- Bug! we expected to output "hello". The problem is not very easy to spot, especially when a function name sounds as though it will change the passed in value.
}
为了避免在函数调用和函数声明(或在某些情况下,文档)之间跳转以了解函数行为,有没有办法在函数调用的语法中显式记录参数预计会改变(即引用参数)或正在发送副本(即按值传递)?
我意识到也可以选择通过 const& 传递,它与按值传递的概念相似,因为传入的变量在函数调用后不会改变其值。
我确信该语言中存在各种可能会增加理解参数传递方式的复杂性的情况 - 但我很好奇,有没有办法以我想要的方式解决这个问题?
我注意到有些人编写了两个相似的函数。其中一个采用值参数,另一个采用指针。这允许调用这样的函数:
Lowercase(str); //we assume the value will not change
Lowercase(&str); //we assume the value will change
但是这个解决方案还有很多其他问题,我不想失去参考的好处。此外,我们仍在对行为做出假设。
【问题讨论】:
-
某些用户会杀了我,把我切成四份,然后用热油烧掉我的部队,但要实现这一点:使用指针。
-
(哦,等等,实际上并没有那么糟糕。即使是谷歌的人也这样做。)
-
@H2CO3 我也在 Facebook 的“愚蠢”库中看到了它。
-
Stroustrup 对此的看法:“为了保持程序的可读性,通常最好避免使用修改其参数的函数。[...] 因此,应该使用“普通”引用参数仅当函数名称强烈暗示引用参数已被修改时” [TC++PL,第 4 版,pp.191]
-
如果你不知道一个函数是做什么的,你不应该调用它。如果您正在维护代码并且遇到函数调用并且您不知道它的作用,那么 RTFM。如果没有 FM,那么您的开发过程就会中断。
标签: c++ c c++11 parameters parameter-passing