重载char类型的operator<<配合std::cout使用时触发段错误
问题原因
你的代码触发段错误是因为无限递归调用:
- 你全局重载了
std::ostream& operator<<(std::ostream&, char),当main里执行std::cout << 'l'时,会匹配到这个自定义重载。 - 而在重载函数内部,
COUT << letter这行代码会再次调用你自定义的重载版本,形成无限递归,最终导致栈溢出,触发段错误。
解决方案
如果确实需要重载char类型的operator<<,可以在重载函数内部调用std::ostream的成员函数版本来绕过递归:
#include <iostream> std::ostream & operator<<(std::ostream & COUT, char letter) { // 调用ostream的成员函数版本,避开全局重载 return COUT.operator<<(letter); } int main(void) { std::cout << 'l'; }
更合理的做法是不要全局重载char类型的operator<<——标准库已经为std::ostream提供了完善的char输出支持,全局重载会破坏标准行为,引发不必要的问题。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

