函数的模糊引用/值版本

Max*_*xpm 4 c++ overloading ambiguity

考虑以下函数原型:

void Remove(SomeContainer& Vec, const std::size_t Index);

SomeContainer Remove(SomeContainer Vec, const std::size_t Index);
Run Code Online (Sandbox Code Playgroud)

第二个是第一个实现的.也就是说,它们在各个方面在功能上是相同的,除了一个是通过引用传递而另一个是按值传递.

但是,GCC说这些在这种情况下是模糊的,即使第一种形式是唯一一种不返回值的形式:

Remove(SomeContainer, 123);
Run Code Online (Sandbox Code Playgroud)

有没有解决方法,或者我必须为每个表单提出不同的名称?

Alo*_*ave 5

返回类型不是函数重载的基础.
函数重载只能使用以下条件之一:

  1. 没有争论
  2. 参数类型&
  3. 参数序列

调用者可以忽略返回类型,因此它不是函数重载的有效标准.

如上所述,传递值并传递一个Reference会给编译器带来歧义.例如:

void doSomething(int i)
{
}

void doSomething(int &i)
{
}

int main()
{
    int val = 10;
    doSomething(val);   //Ambiguous
}
Run Code Online (Sandbox Code Playgroud)

这里编译器无法确定是否传递val到哪个版本doSomething().它可以对任何版本进行有效的函数调用,因此它在编译时请求帮助(因为这是静态链接)并将调用标记为不明确.

在你的情况下.重命名函数或传递指针参数是一个选择/首选项,这将使两个函数重载(同名但不同的参数类型).但是,在选择首选项时,重要的是要考虑要求和功能将要执行的操作.就个人而言,我不会为了超载而选择指针.如果我确实需要重新设置或使我的参数指向不同的变量,那么选择指针参数是有意义的.

简单的方法是只有两个不同的函数名称.没有开销,它与任何其他函数调用一样高效.

  • 按引用传递和按值传递计为不同类型,并且非常好.在C++中,潜在的歧义不是错误.问题在于尝试调用它时,因为编译器不知道`5`应该是`int`还是`int&`. (2认同)
  • @Lstor:嗯,`5`永远不是`int&`.它可能是一个`const int&`,但是...... (2认同)