当使用static_assert
断言function object
的返回类型与另一种类型相同时,我遇到了一种奇怪的行为。类似的东西(这段代码只是用来表示问题而不是我想要做的事情)。
int foo() {
return 0;
}
int main() {
auto funcObj = std::bind(foo);
static_assert(std::is_same<std::result_of<funcObj()>, int>::value, "FuncObj return type is not int");
return 0;
}
断言失败。这里出了什么问题?
答案 0 :(得分:3)
std::result_of<?>
是一种无用的类型,可以直接使用。
typename std::result_of<?>::type
和std::result_of_t<?>
(在C ++ 14中)你想要的是什么。
为此类事情获取良好错误消息的简便方法是:
std::result_of<decltype(funcObj)()> x = 3;
应生成错误消息,以明确lhs类型不是您所期望的int
。 (无法将int
转换为&#39; 某些复杂类型&#39;通常)。
答案 1 :(得分:1)
该行
static_assert(std::is_same<std::result_of<funcObj()>, int>::value, "FuncObj return type is not int");
需要
static_assert(std::is_same<typename std::result_of<decltype(funcObj)()>::type, int>::value, "FuncObj return type is not int");
// Missing pieces ^^^^^^^^ ^^ ^^^^^^