为何函数非返回void时std::is_invocable_r_v<void,TFun>仍返回true?
为什么
std::is_invocable_r_v<void, decltype(task)>返回true? 测试代码:
#include <iostream> #include <type_traits> int main(){ const char* hw = "hello world"; auto task = [hw] ()->const char * { return hw ; }; std::cout << std::is_invocable_r_v<const char *, decltype(task)> << std::endl; std::cout << std::is_invocable_r_v<void, decltype(task)> << std::endl; std::cout << std::is_invocable_r_v<const char, decltype(task)> << std::endl; }
实际运行结果:
1 1 0
预期结果:
1 0 0
原因解析
C++标准对std::is_invocable_r的规则是:当模板参数R为void时,只需要判断可调用对象能否被指定参数调用,不需要考虑返回值类型是否匹配——因为任何函数/可调用对象的返回值都可以被显式忽略,当作void处理。
在这段代码里,task是一个无参可调用对象,能正常返回const char*,所以std::is_invocable_r_v<void, decltype(task)>会返回1(true),这是符合标准的行为。你预期的0是错误的,因为void作为目标类型时,并不要求可调用对象的返回值必须是void,只要调用本身合法即可。
另外两个结果的逻辑:
std::is_invocable_r_v<const char *, decltype(task)>返回1:因为task的返回值就是const char*,可以直接匹配目标类型。std::is_invocable_r_v<const char, decltype(task)>返回0:因为const char*无法隐式转换为const char,不符合要求。
内容的提问来源于stack exchange,提问作者bradgonesurfing
相关产品推荐
相关产品推荐

