You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:24:09