c++ - 为什么 C++ 在语法中不区分按引用传递和按值传递?
问题描述
考虑我有这个功能:
foo(int &x1, int x2);
有人这样称呼它:
int main(){
int x = 1;
foo(x, x);
}
当你只看主函数时,你看不到第一个值是通过引用传递的,第二个是通过值传递的。为什么没有一些额外的语法来“避免这个问题”?例子:
int main(){
int x = 1;
foo(*x, x);
}
我真的不知道,为什么这样指定 C++ 语法。我可以想象这背后有一个原因,我无法理解,因为我之前没有看到一个好的用例。
编辑:可能重复的问题是处理传递引用和传递指针。我的问题是,为什么按引用传递和按值传递确实具有相同的被调用者语法
解决方案
大多数情况下,参数是否通过引用而不是通过值传递,要么是显而易见的(它显然是一个外在参数,或者显然需要原始参数),要么是无关紧要的(它只是一种优化)。其余时间,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
是其他任何东西,它可能会通过常量引用传递以避免无用的副本。
推荐阅读
- excel - 将集合中的值设置为变量
- android - 为什么 ACRA 不向我的 HTTP 服务器发送崩溃报告?
- ansible - 如何在 jinja2 模板中获取 Ansible 服务器的 IP 或主机名
- python - Pandas 在过滤时促进 int 浮动
- python-3.x - 'float' 对象不能被解释为整数 python
- spring-data-rest - 如何在存储库中制作方法,如 Spring Data Rest 中的 GreaterThanOrEquals ..?
- sql - 员工和经理
- amazon-ec2 - 将 kafka 绑定到 0.0.0.0:9092
- kubernetes - 编辑/更新 pod 的 yaml
- java - 谁能告诉我为什么我的 calculateCoin 函数不显示?