c++ - 在没有歧义的情况下是否允许通过引用重载函数?

标签 c++ overloading pass-by-reference language-lawyer

考虑以下代码:

#include <iostream>

void foo(int m);
void foo(int &k);

int main()
{
    foo(5); // ok, because there is no ambiguity

    int m = 5;
    //foo(m); // compile-time error, because of ambiguity
    foo(m + 0); // ok, because it's an expression of type int and not object's lvalue
}

void foo(int m)
{
    std::cout << "by value\n";
}
void foo(int &k)
{
    std::cout << "by reference\n";
}

我知道它为 foo(m) 引入了歧义,但是当表达式是 int 类型(或其他可以转换为 的类型时,这是允许的吗>int)?

我试图找到一些关于此的标准引用,但没有成功。


免责声明:请注意,它不是 Function Overloading Based on Value vs. Const Reference 的拷贝. const 引用是不同的,因为它们可以用 rvalues 分配,这与“普通”、非const 引用资料。

最佳答案

13.1 [over.load] 非常清楚(除了多页注释)关于哪些函数不能在同一范围内重载。

你的案例没有在那里列出,你可以声明那些重载,但你不一定能轻易使用它们。你可以这样调用左值:

void (*f)(int&) = foo;
f(m);

这避免了调用 foo(m) 时发生的歧义。

旁白:另一种编写foo(m + 0)的方法就是foo(+m),一元+运算符将左值到右值,因此调用了 foo(int) 重载。

关于c++ - 在没有歧义的情况下是否允许通过引用重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31453992/

相关文章:

c++ - 重写函数的默认参数

c++ - 防止重新分配引用?

c++ - 使用 Qt 从文件夹加载图像

overloading - 我怎样才能近似方法重载?

c++ - 如何解决以下代码中的函数重载歧义

php - 为什么不推荐在 PHP 中通过引用调用函数?

swift - 有没有办法一起使用模板、输入输出参数和可选参数?

c++ - 添加 stringstream/cout 会损害性能,即使代码从未被调用

c++ - 如何用现有的基类指针构造一个类?

c++ - 为什么 sizeof Variablename/sizeof * VariableName 不能按预期工作?