Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在没有歧义的情况下,是否允许通过引用重载函数?_C++_Overloading_Pass By Reference_Language Lawyer - Fatal编程技术网

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

C++ 在没有歧义的情况下,是否允许通过引用重载函数?,c++,overloading,pass-by-reference,language-lawyer,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

考虑以下代码:

#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";
}
#包括
void foo(int m);
福田(国际及香港);;
int main()
{
foo(5);//好的,因为没有歧义
int m=5;
//foo(m);//编译时错误,因为不明确
foo(m+0);//好的,因为它是int类型的表达式,而不是对象的左值
}
void foo(int m)
{

std::cout是的,这是允许的。

没有规则可以防止这种过载

[C++14:13.1/1]:
并非所有函数声明都可以重载。无法重载的函数声明在此处指定。[..]

[C++14:13.1/2]:
(诸如此类的大量例外不包括本案例中的任何例外)


对于语言来说,禁止函数重载是非常有限的,因为在某些调用的特定场景中,函数重载可能是不明确的,并且没有什么好的理由,我可能会添加!

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

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

void (*f)(int&) = foo;
f(m);
这避免了调用
foo(m)
时出现的歧义


旁白:编写
foo(m+0)
的另一种方法是简单地
foo(+m)
,一元
+
运算符将左值转换为右值,因此调用
foo(int)
重载。

m
也是
int
类型的表达式。可能的重复