c++ - C++ 中的函数重载按值或按引用传递参数

标签 c++ c++11 overloading

如果我们在 C++ 中有这个示例函数代码

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

是否可以通过对调用参数进行任何修改来区分要调用的函数?

如果以这些方式中的某些方式调用函数 foo:

foo( 10);

i = 10;
foo( static_cast<const int>(i));

foo( static_cast<const int&>(i)); 

它被称为第一个 foo 重载函数,因为它不能通过引用将 const 参数传递给非 const 参数。 但是,您将如何调用第二个 foo 重载函数? 如果我用下一种方式调用:

int i = 10;
foo( i);

它发生了一个不明确的错误,因为这两个函数对于这个参数都是有效的。

在此链接中https://stackoverflow.com/a/5465379/6717386它解释了一种解决它的方法:使用对象而不是内置类型并私有(private)化复制构造函数,因此它不能复制对象值,它必须调用第二个 foo 重载函数并通过传递对象引用。但是,内置类型有什么办法吗?我必须更改函数名称以避免重载吗?

最佳答案

你可以做一个(函数的)转换来选择重载函数:

static_cast<void (&)(int&)>(foo)(i);

Demo

关于c++ - C++ 中的函数重载按值或按引用传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38957516/

相关文章:

c++ - 在不重新创建整个 FlatBuffers 的情况下使用(非对象)C++ API 时改变表数组

C++ 将二进制数据转换为十六进制字符串并返回

c++11 - 我们可以使用参数包作为 std::vector 初始值设定项吗?

c++ - 普通函数不会覆盖模板函数

c++ - 重载时未在 C++ 中的范围错误中声明

c++ - 模板成员函数重载问题

c++ - float 数组抛出 "incomplete type is not allowed"

c++ - 如何在 Linux 上的 C++ 中读取 JPEG 和 PNG 像素?

c++ - Windows 上的 Code::Blocks 13.12 即使使用 -std=c++11 也无法识别 std::codecvt

c++ - 如何构建特定函数调用的图形?