以下の関数について考えてみます。この関数bar
のパラメーターには、オーバーロードされた呼び出しから初期化されたデフォルト値がありますfoo
。
#include <iostream>
int foo(int x)
{
std::cout << "foo(int)" << std::endl;
return 0;
}
template<typename T>
void bar(T a, int x = foo(T(0))) {}
double foo(double x)
{
std::cout << "foo(double)" << std::endl;
return 0;
}
int main()
{
bar<int>(1);
bar<double>(1);
return 0;
}
このプログラムが出力することを期待しています
foo(int)
foo(double)
のインスタンス化foo
で表示されるの2つのオーバーロードに対応します。bar
代わりに、でコンパイルするとg++-4.6
、出力は次のようになります。
$ g++-4.6 -std=c++0x test.cpp; ./a.out
foo(int)
foo(int)
デフォルトのパラメーター値を実装するときに、オーバーロードのセットは通常のオーバーロード解決とは異なりますか?このケースはISOC++標準で説明されていますか?