为什么标准不允许通过引用另一个函数来传递函数结果


Why the standard does not allow to pass function result by reference to another function

偶尔你可能会

偶然发现这个:Strict error: Only variables should be passed by reference .解决方法通常是添加一些您永远不会使用的临时变量。

但令我困扰的是,为什么这个警告甚至存在?它有什么用吗?如果我知道我不需要那个该死的变量,为什么不允许我跳过它呢?当使用不面向对象的旧 API 并且疯狂地使用引用参数时,这是最烦人的。

FORTRAN用于通过引用传递所有参数。这可能会导致奇怪的问题,例如:

FUNCTION DUBL(X)
    X = X + X
    DUBL = X
    RETURN
END
Y = DUBL(5.0)
Z = 5.0 + 1.0

最后一行将 Z 设置为 11.0。这是因为倒数第二行的函数调用导致 5.0 翻倍,因此无论 5.0 出现在源代码中的哪个地方,它现在都意味着 10.0。

部分原因是编译器试图节省内存,只会存储每个文本常量值一次。如果每次提到它时都使用单独的 5.0 副本,问题仍然存在,但不会产生任何影响。(如果一棵树在森林里翻了一番,没有人注意到,它真的翻倍了吗?

但主要是因为你传递了一个对文字的非常量引用,有效地将常量变成了一个变量。(谚语是:"常数不是。变量不会。

大多数现代语言要么不允许引用常量,要么只允许在你专门限定它们的情况下引用它们。

对函数结果的非常量引用被认为是禁忌,因为你本质上承诺函数可以修改所引用的东西,但这具有误导性,因为带着所有修改,这个东西即将消失。阻止函数修改它强制函数意识到,如果它想要对引用的对象进行有意义的更改,它应该首先复制对象。

很容易想

出修改对象很有用的方案(通常是因为函数在返回之前会再次引用它(,但还有更多场景会导致微妙且非常难以诊断的错误。程序员对严格带来的不便感到恼火,直到他们被松懈引起的错误咬伤,然后他们就对它非常满意了。