これは非常に衒学的ですが、C++03 では、プログラムが名前空間でテンプレート関数をオーバーロードする(特化しない)ことは明らかに非準拠でした:ここでの言及とcomp.lang.c++.moderated に関する長い議論を参照してください。std
つまり、これは問題ありませんでした:
namespace std
{
template <>
void swap (Foo & f, Foo & g)
{
// ...
}
}
しかし、これはそうではありませんでした(私が正しく理解していれば...):
namespace std
{
template <typename T>
void swap (TempateFoo<T> & f, TempateFoo<T> & g)
{
// ...
}
}
これは C++11 でも当てはまりますか? また、これはテンプレート クラス (のようなstd::hash
) にも適用されますか、それともテンプレート関数だけに適用されますか?
編集:また、後者が実際に物事を壊すような標準ライブラリの実装の例はありますか? そうでない場合、上記の 2 番目のケースのようにオーバーロードを禁止する特定の理由はありますか? (理論上、何が壊れる可能性があるのでしょうか?)