下面的示例在我尝试过的所有编译器中均失败:gcc-8.2,clang-8.0(都尝试了选项--std=c++17
和std=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;
答案 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?
在这种情况下也是如此,decltype
和declval
的结果比result_of
更简单:
using f = decltype(foo<&bar::a>::q(declval<bar&>()));
using q = decltype(qoo<&bar::a>(declval<bar&>()));