12

このことを考慮:

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で問題なくコンパイルされることはかなり確信しています(ただし、現時点では確認できません)。誰が正しいですか?

4

2 に答える 2

6

gcc 4.7 では、コンパイルが失敗します。これがgcc 4.8で問題なくコンパイルされることはかなり確信しています(ただし、現時点では確認できません)。誰が正しいですか?

静的アサーションの条件は、テンプレート パラメーターに依存しません。したがって、コンパイラはfalse、テンプレートを解析するときにすぐにそれを評価し、アサーションが起動する必要があることを認識できます-実際にテンプレートを他の場所でインスタンス化するかどうかに関係なく。

同じことがどのコンパイラにも当てはまります。

于 2013-04-30T15:03:46.677 に答える