带省略号的函数重载

时间:2012-09-15 10:24:28

标签: c++

我真的可以像这样使用函数重载:

#include <iostream>

void foo(...)
{
   std::cout << "::foo(...) \n";
}

void foo(int)
{
   std::cout << "::foo(int) \n";
}

int main()
{
   foo(0);
   foo('A');
   foo("str");
   foo(0, 1);
}

关于它的标准是什么?在什么样的情况下我会得到:: foo(...)?

4 个答案:

答案 0 :(得分:2)

void foo(int)

将接受int类型的一个参数。

void foo(...)

接受任意类型的任意数量的参数。当调用没有单个int参数时,将选择它。一般来说,不是很有用。

另请注意,将类类型的对象传递给...是未定义的行为。

答案 1 :(得分:2)

在N3337中我可以看到: -

  

13.3.2可行的功能
  具有少于m个参数的候选函数仅在以下情况下是可行的   它的参数列表中有一个省略号(8.3.5)。出于...的目的   重载决议,任何没有对应的参数   参数被视为 “匹配省略号”(13.3.3.1.3)。

答案 2 :(得分:0)

以下列方式声明函数时:

  void foo (...) 

这意味着foo接受任意数量的参数。

因此,当这是必须合适的函数时,将调用此函数。

在你的情况下,只要你不写:

foo(//Some single int).

在你的具体主题中,这将会发生:

foo(0)     //Calls foo(int).
foo('A)    //Calls foo (int). as you can convert a char to an int.
foo("str") //Calls foo(...) . as you can not convert a string to an int.
foo(1,2)   //Calls foo(...) . as this is the only possible function 
             cause the second foo function only takes one int.

答案 3 :(得分:0)

void foo(...)将采用变量参数。当没有或者类型的参数与提供的具有相同函数名的函数的参数列表不匹配时,它将被调用。

foo(0);             //This will call void foo(int) function
foo('A');           //This will call void foo(int) function
foo("str");         //This will call void foo(...) function
foo(0, 1);          //This will call void foo(...) function

注意:

尽管省略号在函数重载时工作正常,但强烈建议不要追求可变函数。至少在你有更多的C ++经验来理解陷阱之前。我建议只使用try catch块,因为有些情况下无法预测错误。