2

ここで簡単な例:

#include <type_traits>
int foo() {
    return 2;
}
struct A {
    int operator()(int&& x) {
        return x*2;
    }
};
int main(int, char**) {
        std::result_of<A&(int)>::type x = 42;
        return 0;
}

VisualStudio 2012 でコンパイルしようとすると、エラーが発生します。

error C2664: 'int A::operator ()(int &&)' : cannot convert parameter 1 from 'int' to 'int &&'
You cannot bind an lvalue to an rvalue reference

mingw-g++ で同じコードをコンパイルすると、すべて正常に動作します。独自の result_of 実現を記述する以外に、何かできることはありますか? (回避策として書きました)。

4

2 に答える 2

1

std::unary_function からファンクターを継承すると、VS2012 のこのバグが解決するようです

于 2015-12-22T00:07:52.613 に答える
1

std::result_ofこれはorの実装のバグだと思いますstd::declval<>()

C++11 標準の 20.9.7.6 項 (表 57) では、 について次の条件を満たさなければならないと規定されていますresult_of

INVOKE(declval<Fn>(), declval<ArgTypes>()...)未評価のオペランドとして扱われるときに式 が適切に形成されている場合 (第 5 節)、メンバー typedeftypeは型に名前を付ける ものとしdecltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...)); ます。それ以外の場合、メンバー型は存在しません。

この場合、型の右辺INVOKE(declval<A&>(), declval<int>())値で型の左辺値を呼び出すことに解決されます (段落 20.8.2/1 を参照)。Aint

の呼び出し演算子を考慮するとA、メンバ typedeftypeは に解決されintます。

于 2013-05-30T15:24:02.407 に答える