下面的示例对我尝试过的所有编译器都失败了:gcc-8.2、clang-8.0(尝试过--std=c++17
和std=c++2a
这两个选项(和zapcc-2017.08。
从我的角度来看,代码示例是有效的,应该进行编译。或者,至少应该有一个更全面的错误。它看起来确实像std库中的一个bug,没有涵盖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...)>
表示"用Args...
调用F
的结果"。
result_of_t<int(bar&)>
表示"用bar&
调用int
的结果"。它不存在,因为你不能用任何东西来调用int
。
result_of
是而不是"从函数类型中提取返回类型"。
尝试
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
,这将有助于简化代码(:我如何使用result_of而不是decltype?
在这种情况下也是如此,其中decltype
和declval
将给出比result_of
更简单的结果:
using f = decltype(foo<&bar::a>::q(declval<bar&>()));
using q = decltype(qoo<&bar::a>(declval<bar&>()));
实时示例