使用C++11 std::is_same检查函数签名报错,如何排查与修复?
嘿,我来帮你拆解这个问题~
首先先回顾下你的代码和报错情况:
你的代码
//test.cpp #include <type_traits> double* func() {} static_assert(std::is_same<double*(*)(), decltype(func)>::value, ""); int main() {}
编译命令
g++ -std=c++11 -c test.cpp
报错信息
test4.cpp:6:1: error: static assertion failed:
static_assert(std::is_same<double*(*)(), decltype(func)>::value, "");
^
问题出在哪?
核心原因是类型不匹配:
- 你在
std::is_same的第一个模板参数写的是double*(*)(),这是函数指针类型 - 但
decltype(func)得到的是函数类型double*()
这俩是完全不同的类型,所以static_assert会触发失败。这里要注意:函数名func在大多数场景下会隐式转成函数指针,但decltype是个特殊情况——它会严格保留表达式的原始类型,不会做这个隐式转换。
怎么修复?
有两种简单的修复方式,选一种就行:
方法1:修改std::is_same的第一个参数为函数类型
既然decltype(func)是函数类型,那我们把对比的类型改成匹配的函数类型double*()就行:
//test.cpp #include <type_traits> double* func() {} static_assert(std::is_same<double*(), decltype(func)>::value, "类型不匹配"); int main() {}
方法2:让decltype得到函数指针类型
我们可以通过取地址操作&func来获取函数指针,或者用std::decay_t来把函数类型衰减成函数指针类型:
方式2.1:使用&func
//test.cpp #include <type_traits> double* func() {} static_assert(std::is_same<double*(*)(), decltype(&func)>::value, "类型不匹配"); int main() {}
方式2.2:使用std::decay_t(C++11及以上可用)
//test.cpp #include <type_traits> double* func() {} static_assert(std::is_same<double*(*)(), std::decay_t<decltype(func)>>::value, "类型不匹配"); int main() {}
这几种方式都能让static_assert通过编译,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者embedc
相关产品推荐
相关产品推荐

