【C++】const int和int究竟是不是同一种类型
结论
我认为,const int和int严格意义上不是同一种类型,deepseek给出的结论中编译器也不把它们视为同一种类型。
这一点变量的声明和定义分离中体现的尤为明显。
声明和定义分离
1 | // MyClass.h |
头文件中负责声明,源文件中负责定义。定义中少了const会报错:conflicting declaration int MyClass::count。
意为:不兼容的声明,或者说声明冲突了。
所以编译器在严格意义上也会认为它们是不同的类型。
函数重载的特殊情况
既然编译器认为它们是不相同的类型,为什么在函数重载时void f(int x)和void f(const int x)编译器不通过,视为重定义呢。
这是因为编译器在判断函数重载,生成函数签名时将函数参数内的const去掉了。将void f(const int)视为void f(int)。
为什么要去掉呢,从下面几个角度思考:
- 如果
const可以保留住视为不同的类型,真正调用的时候应该调用哪个函数呢。因为这时函数参数是拷贝赋值,const的重点是形参变量x,调用方传入const int或者int都可以,这都允许赋值。造成了二义性 - 编译器只需要检测函数内部是否有修改
x的行为就可以保证const的修饰属性,然后在最后生成函数签名判断函数重载时将const去掉就能避免二义性。
综上,函数重载编译不通过不是说就能得出 const int和int是相同类型的结论,只是因为在生成函数签名时const被去掉了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星の夜!
