为何被约束为整数类型的C++模板函数可正常处理char类型?
问题
我编写了如下C++模板函数:
#include <iostream> #include <concepts> template <typename T> requires std::integral<T> T add(T a, T b) { std::cout << "From within the function, typeid(T).name(): " << typeid(T).name() << std::endl; std::cout << "From within the function, typeid(a).name(): " << typeid(a).name() << std::endl; return a + b; }
在main函数中按如下方式调用:
int main() { char a_0{10}; char a_1{20}; std::cout << "typeid(a_0).name(): " << typeid(a_0).name() << std::endl; auto result_a = add(a_0, a_1); std::cout << "result_a : " << static_cast<int>(result_a) << std::endl; }
我原本预期会出现编译错误——因为模板参数被约束为整数类型(std::integral<T>),但传入的是char类型参数。实际使用命令g++ "-static" -o main.exe .\*.cpp -std=c++20编译后可正常运行,输出如下:
typeid(a_0).name(): c typeid(T).name(): c typeid(a).name(): c result_a : 30
请问为何该模板函数可以正常处理char类型?
解答
这是因为*char类型本身就属于std::integral概念涵盖的类型*。
在C++标准中,std::integral概念的定义包含了所有的整数类型,具体包括:
char、signed char、unsigned charshort、unsigned shortint、unsigned intlong、unsigned longlong long、unsigned long long- 以及其他符合整数类型定义的扩展类型
虽然char通常被用来存储字符,但它本质上是一个整数类型——它的底层存储是单个字节的整数值,符合std::integral约束对整数类型的要求,因此模板参数推导时会认为char满足约束,不会触发编译错误。
你看到的输出中typeid返回的c正是char类型的标识,也印证了模板实例化时使用的是char类型,且符合约束条件。
内容的提问来源于stack exchange,提问作者VivekDev
相关产品推荐
相关产品推荐

