c++ - 基于值与常量引用的函数重载

标签 c++ pass-by-reference pass-by-value overloading

是否声明如下内容

void foo(int x)        { std::cout << "foo(int)"         << std::endl; }
void foo(const int &x) { std::cout << "foo(const int &)" << std::endl; }

有没有道理?调用者如何区分它们?我试过了

foo(9);  // Compiler complains ambiguous call.

int x = 9;
foo(x);  // Also ambiguous.

const int &y = x;
foo(y);  // Also ambiguous.

最佳答案

意图似乎是区分临时参数调用(即 9)和“常规”参数传递。第一种情况可能允许函数实现采用优化,因为很明显参数将在之后处理(这对于整数文字绝对毫无意义,但对于用户定义的对象可能有意义)。

但是,当前的 C++ 语言标准没有提供专门针对参数的“左/右值”进行重载的方法 - 任何作为参数传递给函数的左值都可以隐式转换为引用,因此歧义是不可避免的。

C++11 引入了一个用于类似目的的新工具 — 使用 r 值引用,您可以按如下方式重载

void foo(int x)        { ... }
void foo(const int &&x) { ... }

... 和 foo(4)(作为参数传递的临时右值)将导致编译器在 int i = 2 时选择第二个重载; foo(i) 会选择第一个。

(注意:即使使用新的工具链,也无法区分样本中的案例 2 和案例 3!)

关于c++ - 基于值与常量引用的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47907604/

相关文章:

c++ - 在编译时获取静态 constexpr 数组的最小值/最大值

c - 如何在 C 中通过引用传递变量?

c# - 难以理解按引用传递

language-agnostic - 按引用传递与按值传递有什么区别?

Javascript 通过引用传递对象然后更新

C 编程 - 传递引用

c# - Windows Mobile - 停止主手机应用程序

c++ - 从 Vulkan 中的 R16_UINT-3D 纹理在片段着色器中采样值

c++ - 使用 cocos2d-x 将 Sprite 内容保存为 .png 文件

C++ - 在返回 int 的函数中通过引用传递参数