错误:“类std :: result_of”中的“ type”未命名类型

时间:2018-11-08 17:53:28

标签: c++ templates c++17 c++20 result-of

下面的示例在我尝试过的所有编译器中均失败: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;

3 个答案:

答案 0 :(得分:4)

result_of_t<F(Args...)>的意思是“用F调用/调用Args...的结果。”

result_of_t<int(bar&)>的意思是“用int调用bar&的结果”。哪个不存在,因为您无法用任何东西调用int

result_of不是 “从函数类型中提取返回类型”。

答案 1 :(得分:2)

尝试

std::result_of

正如T.C.所更好地解释的那样,std::result_of<decltype(foo<&bar::a>::q)> 中的std::result_of是在使用某些参数类型进行调用时从可调用类型返回的类型。

如果你写

&

您仅将可调用对象的类型传递给foo(几乎:您还需要在bar之前加上std::result_of<decltype(&foo<&bar::a>::q)(bar&)> );您还必须传递参数的类型(在这种情况下,只有一个参数:{{1}}引用),所以

{{1}}

答案 2 :(得分:1)

根据我的经验,result_of确实没有decltype做不到的任何事情(或result_of_t可以简化代码的事情):How Can I Use result_of Instead of decltype?

在这种情况下也是如此,decltypedeclval的结果比result_of更简单:

using f = decltype(foo<&bar::a>::q(declval<bar&>()));
using q = decltype(qoo<&bar::a>(declval<bar&>()));

Live Example