news 2026/6/15 20:01:12

你认为 C++ 最不应该存在的特性是什么?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
你认为 C++ 最不应该存在的特性是什么?

如果你问大多数长期写 C++ 的人(尤其是用现代 C++ 的开发者),“C++ 最不应该存在的特性是什么?”,答案其实高度分散,但经常被反复点名的几个“罪魁祸首”集中在下面这几类(按被吐槽频率从高到低排序,2024–2025 社区共识视角):

Top 候选名单(社区最常提的“应该删掉/重做”的特性)

  1. C 风格数组 + 指针衰退(array-to-pointer decay) + 裸指针泛滥
    几乎是压倒性票数第一的“原罪”。

    • 为什么最该死:C++ 从 C 继承了“数组名退化为指针”的规则,导致int a[10]; func(a);瞬间丢失大小信息,埋下无数越界、内存安全隐患。
    • 现代 C++ 明明有std::spanstd::arraystd::vectorstd::string_view,但语言层面仍然允许/鼓励裸指针 + 衰退,导致新手/老代码继续写不安全代码。
    • 很多人直言:“如果 C++ 一开始就把数组当成第一类对象(带边界检查),安全性起码提升一个数量级。”
  2. 隐式转换地狱(尤其是单参数构造函数 + 转换运算符)

    • bool operator bool()operator int()MyString(const char*)这些东西导致的意外转换、歧义、重载解析爆炸。
    • C++11 加了explicit但默认还是允许,历史包袱太大。
    • Herb Sutter 等人在安全 profile 里都想把大部分隐式转换干掉。
  3. 多重继承 + 虚继承(virtual inheritance)

    • 菱形继承问题、虚基类指针偏移、内存布局不可预测、调试地狱。
    • 现代 C++ 几乎没人敢用多继承实现(都用接口 + 组合),但语言还保留着完整的机制,增加理解成本和编译器复杂度。
  4. C 风格字符串(char+ strcpy / strlen / sprintf 家族)*

    • 缓冲区溢出之源,安全漏洞温床。
    • C++ 提供了std::string几十年了,但标准库和 C API 还在到处用const char*,强制大家写strlenstrcpy_s等防御代码。
  5. 头文件 + 重复包含 + 前向声明地狱

    • 没有 modules 之前(C++20 Modules 还是半残),头文件管理是痛苦之最。
    • 即使 C++20/23/26 Modules 来了,兼容旧代码的代价巨大,实际使用率低。
  6. 未定义行为(UB)密度过高

    • 严格别名违规、signed overflow、null 指针解引用、越界、use-after-free 等 UB 太多,而且编译器可以随便“假设不发生”然后生成核弹级优化。
    • 这不是单个特性,而是整个语言哲学的问题,但很多人觉得“默认允许 UB”是最大的设计失误。

如果只能选一个“最不应该存在”的,我个人投给:

数组名到指针的隐式衰退(array-to-pointer decay) + 裸指针作为默认参数/返回类型被允许

理由:

  • 它直接导致了 C++ 前 30 年 70%+ 的内存安全 bug
  • 现代替代方案(span / array / vector / ranges)已经非常成熟
  • 保留这个规则纯粹是为了兼容 1972 年的 C,而这个兼容性代价现在已经远超收益
  • Rust 直接把这个设计砍掉,证明了可以砍,而且砍了之后世界更美好

Bjarne Stroustrup 本人怎么看?

他公开说过几次“后悔”或“如果重来”的点(从访谈/论文中):

  • 没有在早期就强制更强的类型安全
  • 模板语法太复杂(concepts 晚了十几年)
  • 允许太多的隐式行为和兼容 C 的代价

但他也反复强调:“没有哪个主要特性是应该完全删除的”,因为它们都有历史价值和使用场景。

结论(2026 年视角)

C++ 最不应该存在的特性其实不是某个单一功能,而是“为了兼容 C 而保留的大量危险默认行为”这个整体设计决策。

如果能时光倒流,大多数现代 C++ 开发者最想改的可能是:

“让 C++ 从一开始就默认更安全,而不是把安全当成 opt-in。”

你自己最讨厌 C++ 的哪个特性?是上面这些,还是别的更小众的雷(比如 union、goto、volatile、exception specifications 等)?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 0:55:01

干软件前端累还是后端累?

2025–2026 年这个时间点,问“干软件前端累还是后端累”,其实没有绝对答案,但从真实反馈、招聘趋势、社区讨论(知乎/掘金/Reddit/CSDN 等)来看,大多数人的主观感受可以总结成下面这张对比表。 维度前端更累…

作者头像 李华
网站建设 2026/6/15 17:45:10

HoRain云--Linux必备:Node.js与Git安装全攻略

🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/6/14 18:35:07

3步轻松识别单向好友:微信好友状态检测工具使用指南

3步轻松识别单向好友:微信好友状态检测工具使用指南 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends …

作者头像 李华
网站建设 2026/6/14 21:17:01

学术文献下载神器:Zotero-SciHub插件让免费获取文献不再是难题

学术文献下载神器:Zotero-SciHub插件让免费获取文献不再是难题 【免费下载链接】zotero-scihub A plugin that will automatically download PDFs of zotero items from sci-hub 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-scihub 在学术研究中&am…

作者头像 李华
网站建设 2026/6/15 0:42:13

从0开始学大模型:Qwen3-0.6B零配置部署指南

从0开始学大模型:Qwen3-0.6B零配置部署指南 1. 为什么你不需要再为部署发愁——真正开箱即用的轻量大模型 你是不是也经历过这些时刻: 看到一篇大模型教程,光是环境配置就卡在CUDA版本、PyTorch编译、transformers兼容性上两小时&#xff…

作者头像 李华
网站建设 2026/6/14 14:13:42

原神辅助工具高效使用指南:让你的提瓦特之旅如虎添翼

原神辅助工具高效使用指南:让你的提瓦特之旅如虎添翼 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Huta…

作者头像 李华