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++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;
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):
这在这种情况下也适用,其中 decltype
和 declval
会给你一个比 result_of
:
更简单的结果
using f = decltype(foo<&bar::a>::q(declval<bar&>()));
using q = decltype(qoo<&bar::a>(declval<bar&>()));
以下示例在我尝试过的所有编译器中均失败: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;
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):
这在这种情况下也适用,其中 decltype
和 declval
会给你一个比 result_of
:
using f = decltype(foo<&bar::a>::q(declval<bar&>()));
using q = decltype(qoo<&bar::a>(declval<bar&>()));