2012-09-15 100 views
5

重载我可以实际使用的函数重载这样的:功能的省略号

#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(...)?

+1

可变参数。 –

回答

0

在声明以下列方式的函数:

void 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. 
0

void foo(...)将可变参数。并且当参数的no或者类型与具有相同函数名称的其他函数的提供的参数列表不匹配时将被调用。

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块中使用它,在那里有错误无法预测的情况。

2
void foo(int) 

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

void foo(...) 

接受任意数量的任何类型的参数。当呼叫没有单个int参数时,它将被选中。一般来说,这不是非常有用。

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

+0

非POD类的类型,即。 (C++ 11在琐碎方面表达了这一要求,并将UB更改为有条件支持的实现定义的行为。) –

+0

*条件支持的实现定义的行为*对我来说听起来更糟糕。:-)看起来很像*不要做!*。 –

2

在N3337我可以看到: - 具有比m个参数更少

13.3.2可行函数
候选功能是可行的只有 它有在它的参数列表(8.3省略号。 5)。对于 重载解析的目的,任何参数对于其中不存在对应 参数被认为“匹配省略号”(13.3.3.1.3)。