【发布时间】:2019-07-13 12:25:48
【问题描述】:
在评论我关于 std::conjunction 不是短路 (Conjuction template doesn't short circuit) 的问题时,我被推荐 std::is_invocable_r 作为我的问题的解决方法。然而,当我尝试使用它时,我发现了一些非常奇怪的行为。例如,这段代码失败了两个断言:
#include <type_traits>
int main()
{
static_assert(!std::is_invocable_r_v<void, int(int), int>);
static_assert(std::is_convertible_v<int,void>);
return 0;
}
注意cppreference上is_invocable_r的描述:
确定是否可以使用参数
ArgTypes...调用Fn以产生可转换为R的结果。
显然int 不能转换为void,第二个断言证实了这一点。问题是为什么std::is_invocable_r_v<void, int(int), int> 会产生true 值。这是一个活生生的例子:https://godbolt.org/z/HywH7D
请注意,可以使用std::is_void_v<std::invoke_result_t<int(int),int>> 在这里获得正确答案(https://godbolt.org/z/YMvc47),但这不是我的问题。 (而且它并没有解决我从连词问题中遇到的问题)。
【问题讨论】:
-
您可能会阅读Callable 以了解
INVOKE的定义,它确实对void具有特殊行为。