このことを考慮:
template <typename T>
struct hash
{
static_assert(false,"Not implemented.");
};
struct unhashable {};
template <typename T>
auto test(const T &t) -> decltype((*(hash<T> const *)nullptr)(t),int);
void test(...);
int main()
{
std::cout << std::is_same<decltype(test(std::declval<unhashable>())),void>::value;
}
明らかにヘッダーが欠落していることは別として、これはコンパイルする必要がありますか?
言い換えれば、オーバーロードされた関数テンプレートの戻り値を推測している間に後続の decltype 内でトリガーされる静的アサーションの失敗がコンパイルを停止するように要求されているのか、それともオーバーロードを単に破棄する必要があるのか を尋ねています。
gcc 4.7 では、コンパイルが失敗します。これがgcc 4.8で問題なくコンパイルされることはかなり確信しています(ただし、現時点では確認できません)。誰が正しいですか?