4
auto lambda = [](){ return 7; };
std::result_of<decltype(lambda)()>::type val = lambda(); //  'val' : illegal use of type 'void'

エラーが発生します:'val' : illegal use of type 'void'。タイプがvoidとして解決されるのはなぜですか?

私は何が私を得るのかについて誤解されるかもしれresult_ofません。渡すことができるものからの戻り値が欲しいだけですstd::function

4

1 に答える 1

5

コンパイラがそれをコンパイルできない場合は、以下を使用しないでくださいstd::result_of

decltype(lambda()) val = lambda();

これはまったく同じであり、VC2010でも機能するはずです(まあ、可能性があります)。

を使用することもできますがauto、これはあなたが望むものではないと思います:

auto val = lambda();

編集:これを関数の戻り値で使用しているため、decltype上記の解決策は正常に機能します。

#include <type_traits>
#include <iomanip>
#include <iostream>

template<class Functor>
auto foo(const Functor &f) -> decltype(f()) {
    return f();
}

int main() {
    auto lambda = [](){ return 7; };
    auto val = foo(lambda);
    std::cout << std::boolalpha;
    std::cout << std::is_same<decltype(val), int>::value << std::endl;
}

ここでデモ。

于 2012-08-13T17:26:39.560 に答える