首页 > 解决方案 > 为什么 C++ 在语法中不区分按引用传递和按值传递?

问题描述

考虑我有这个功能:

foo(int &x1, int x2);

有人这样称呼它:

int main(){
    int x = 1;
    foo(x, x);
}

当你只看主函数时,你看不到第一个值是通过引用传递的,第二个是通过值传递的。为什么没有一些额外的语法来“避免这个问题”?例子:

int main(){
    int x = 1;
    foo(*x, x);
}

我真的不知道,为什么这样指定 C++ 语法。我可以想象这背后有一个原因,我无法理解,因为我之前没有看到一个好的用例。

编辑:可能重复的问题是处理传递引用和传递指针。我的问题是,为什么按引用传递和按传递确实具有相同的被调用者语法

标签: c++reference

解决方案


大多数情况下,参数是否通过引用而不是通过值传递,要么是显而易见的(它显然是一个外在参数,或者显然需要原始参数),要么是无关紧要的(它只是一种优化)。其余时间,API 要么设计不当,要么你真的应该关心你在做什么并阅读手册/智能感知/标题。

但这不是显式标记引用参数(这意味着在调用代码中)会成为巨大障碍的原因:
神奇的词是template.

C++ 模板比 C#/Java 风格的泛型更具表现力,它们形成了自己的图灵完备语言。编写更复杂的模板可能会很困难,而不必迎合“这可能是一个 ref-argument”,并编写额外的变体来标记它。

一个示例模板:

template <class T>
void logged_store(T&& t) {
    std::log << "storing \"" << t << "\"\n";
    storage.store(std::forward<T>(t));
}

如果t是基本类型(指针、整数、浮点数……),它将按值传递给流插入器。
如果t是其他任何东西,它可能会通过常量引用传递以避免无用的副本。


推荐阅读