次のコードを検討してください。
#include <stdio.h>
namespace Foo {
template <typename T>
void foo(T *, int) { puts("T"); }
template <typename T>
struct foo_fun {
static void fun() { foo((T *)0, 0); };
};
}
namespace Foo {
void foo(int *, int) { puts("int"); }
}
using namespace Foo;
int main() {
foo_fun<int> fun;
fun.fun();
}
期待される出力は何ですか?「T」またはint?
1つのコンパイラ(AppleのXcode3.1.2のgcc4.0.1)は「int」を出力し、他の2つのコンパイラ(gcc 4.1.2および4.1.3)は「T」を出力します。
foo(int *、int)宣言/定義をfoo(T *、int)バージョンの前に移動すると、すべて「int」が出力されます。この場合のオーバーロード/特殊化の順序は、現在の標準で定義されていますか?