6

このような関数のオーバーロードを実際に使用できますか:

#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

4 に答える 4

3
void foo(int)

は type の引数を 1 つ受け入れますint

void foo(...)

任意の数の任意の型の引数を受け入れます。int呼び出しに単一の引数がない場合に選択されます。一般的に、あまり役に立ちません。

また、クラス タイプのオブジェクトを に渡すのは未定義の動作であることに注意してください...

于 2012-09-15T10:34:34.230 に答える
2
于 2012-09-15T10:43:39.917 に答える
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 ブロックで使用することをお勧めします。

于 2012-09-15T10:32:24.480 に答える
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.
于 2012-09-15T10:28:37.780 に答える