Clang-3.2 はコンパイルでき、コードは期待どおりに動作します。
struct have_f { int f(int i) {return 10;} };
struct empty {};
template <class T>
struct outer {
T t;
// if T have f(), define outer_f()
template<class U=decltype(t.f(1))>
int outer_f(int i) { return t.f(i); }
};
int main() {
outer<have_f> o1;
outer<empty> o2;
// to silence unused var warning
return o1.outer_f(10) + sizeof(o2);
}
どのバージョンの GCC も次のように拒否します。
t.cc:13:6: error: ‘struct empty’ has no member named ‘f’
int outer_f(int i) { return t.f(i); }
^
誰が正しいですか?GccまたはClang?
実際の回答なしで、同様の質問があったことに注意してください。