error: `type` in `class std::result_of` does not name a type

error: `type` in `class std::result_of` does not name a type

以下示例在我尝试过的所有编译器中均失败:gcc-8.2、clang-8.0(选项 --std=c++17std=c++2a 均已尝试)和 zapcc-2017.08。

从我的角度来看,代码示例是有效的,应该编译。或者,至少,应该有一个更全面的错误。它看起来确实像是 std 库中的错误,没有涵盖 result_of 的这种特殊情况。我错了吗?

#include <type_traits>
using namespace std;
struct bar {
    int a;
    long b;
};

template<auto M>
struct foo {
    static auto q(bar & b) {
        return b.*M;
    }
};

template<auto M>
auto qoo(bar & b) {
    return b.*M;
}


// error: 'type' in 'class std::result_of<int(bar&)>' does not name a type
using f = typename result_of<decltype(foo<&bar::a>::q)>::type;
// error: 'type' in 'class std::result_of<int(bar&)>' does not name a type
using q= typename result_of<decltype(qoo<&bar::a>)>::type;

result_of_t<F(Args...)> 表示 "the result of calling/invoking F with Args...".

result_of_t<int(bar&)> 表示 "the result of calling int with bar&"。这是不存在的,因为你不能用任何东西调用 int

result_of 不是 "extract the return type from a function type".

试试

using f = typename std::result_of<decltype(&foo<&bar::a>::q)(bar&)>::type;

using q= typename std::result_of<decltype(&qoo<&bar::a>)(bar&)>::type;

正如 T.C 更好地解释的那样,std::result_of 中的 type 是使用某些参数类型调用时从可调用类型返回的类型。

如果你写

std::result_of<decltype(foo<&bar::a>::q)>

你只传递给 std::result_of 可调用的类型(几乎:你还需要 foo 之前的 &);你还必须传递参数的类型(只有一个参数,在这种情况下:bar 引用),所以

std::result_of<decltype(&foo<&bar::a>::q)(bar&)>

根据我的经验,确实没有什么 result_of 可以做而 decltype 做不到的(或 result_of_t which would help simplify your code):

这在这种情况下也适用,其中 decltypedeclval 会给你一个比 result_of:

更简单的结果
using f = decltype(foo<&bar::a>::q(declval<bar&>()));
using q = decltype(qoo<&bar::a>(declval<bar&>()));

Live Example