在评论有关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
的描述:
确定是否可以使用参数
Fn
调用ArgTypes...
以产生可转换为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)获得正确答案,但这不是我的问题。 (而且不能从合取题中解决我的问题)。