错误:"class std::result_of"中的"type"没有命名类型



下面的示例对我尝试过的所有编译器都失败了:gcc-8.2、clang-8.0(尝试过--std=c++17std=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?

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

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

实时示例

相关内容

  • 没有找到相关文章

最新更新