6

コンパイラ: TDM-GCC-5.1.0 (SJLJ アンワインド)

で遊んでいてdeclval、それが機能するはずのコンテキストで使用できないことに気付きました: への引数としてtypeid()

次のコードでは、declval主な使用例の 1 つである、インスタンスを介さずにメソッドの戻り値の型を取得するために使用します。私が得るエラーは の static_assert メッセージですが、この場合は引数を評価しないdeclvalため、それは不可能なはずです:typeid()

#include <typeinfo>
#include <utility>

struct Foo
{
    int func();
};

int main()
{
    typeid(std::declval<Foo>().func());
}

これは私のためにコンパイルされません(でコンパイルした場合-std=c++14)。私の唯一の推測は、コンパイラのバグを発見したか、明らかに間違ったことをしたのにそれが見えないかのどちらかです。後者でしたら、申し訳ありません。

編集:私を助けてくれたildjarnに感謝します。解決策はを使用することですdecltype。したがって、コードの最後の行は次のようになります。

typeid(decltype(std::declval<Foo>().func()));

これはうまく機能します。しかし、今私の質問は次のようになります。typeid()とはどちらdecltype()も未評価のコンテキストなので、違いがわかりません。

4

1 に答える 1