よく分からない話

一つめのアレは実は「え、RVO?」とか思ってたけど、そうかmakeSの呼び出しがRVOされるのかー。
C++.Tのオーバーロード解決の話はなんか

void f(int);
template<typeid T> where { ConceptA<T> } void f(T);
template<typeid T> where { ConceptB<T> } void f(T);
template<typeid T> typename enable_if<is_same<T, double>, void>::type f(T);

とかの場合はどうなるんだろうと思った。にはさんが思いついた方法で書き直すと、

template<typeid T> where { T ~ int } void f(T);
template<typeid T> where { ConceptA<T> } void f(T);
template<typeid T> where { ConceptB<T> } void f(T);
template<typeid T> typename enable_if<is_same<T, double>, void>::type f(T);

で、一番下のヤツは場合制約ベースで解決できんのかこれ…Overload Resolutionのルールをちゃんと理解してないから知らん。いや、制約ベースで考えたとしたら、特に制約ないから一番適合度合いが低い扱いになるのかな?やっぱり知らん。
あと、

template<typename T>
struct id { typedef T id; };
template<typename T>
void f(T) { printf("T"); }
template<typename T>
void f(typename id<T>::type) { printf("id<T>::type"); }
int main() {
    f(1);
    f<int>(1);
}

がgcc4.4, 4.6(trunk), VC(の多分そこそこ新しいやつ)でコンパイル及び実行結果が違うけどどれが正しいのか的な。
f(1)ではそもそもテンプレート版が呼ばれたらおかしいのはいいとして、f(1);は多分曖昧でコンパイルエラーになるはずで、その点では4.4が期待する動作だけど規格読んでも根拠見つけられなかったので知ってる人はどこか人目につきやすい場所にFCDか何かのパラグラフとセクションを示せばいいんじゃないでしょうかみんな喜びます。