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::result_ofor的实现中的一个错误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 回答
1

从 std::unary_function 继承仿函数似乎可以解决 VS2012 的这个 bug

于 2015-12-22T00:07:52.613 回答