よく分からない話
一つめのアレは実は「え、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