【发布时间】:2023-03-04 16:23:02
【问题描述】:
如果我们有这个 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 中,解释了解决它的一种方法:使用对象而不是内置类型并使用私有的复制构造函数,因此它不能复制对象值,它必须被称为第二个 foo 重载函数并通过引用传递对象。但是,内置类型有什么办法吗?我必须更改函数名称以避免重载?
【问题讨论】:
-
你试过
foo( static_cast<int&>(i));吗? -
您可以改用
void foo(int x)和void foo(int *x)。 -
@mvidelgauz 是的,我已经尝试过了。与上述相同的错误。 :(
-
@DimChtz 是的,这种方式有效。但是使用引用?
-
最简单的解决方案是编写更好的函数。或者将它们放在不同的命名空间中。
标签: c++ c++11 overloading