十五年间,C++标准委员会持续在做一件事:把自己推出的特性标记为“不推荐”。最新的例子是std::function——这个C++11引入的可调用对象包装器,在C++26迎来了它的正式替代品std::copyable_function,但委员会的官方建议不是“在新场景下用新版本”,而是“别再用原来的std::function”。
这并不是孤例。自C++11以来,委员会一直在书面上正式撤销自己发布的特性。最典型的是std::auto_ptr——C++98的智能指针,因复制即移动的奇怪语义破坏了泛型代码和容器,从C++11开始被标记为deprecated,最终在C++17中被完全移除,连同整个& functional>适配器家族都被lambda取代。类似的命运也降临在动态异常规范(throw(specifiers))、std::iterator基类、以及C++11的垃圾收集接口上——后者最为尴尬,接口被设计出来却从未有实现真正支持,在C++23被悄悄移除。
第二层级的“撤销”更为普遍:是资深工程师入职第一天就会告诉新人的“不要用这个”。而第三层级最令人无奈:由于ABI兼容性问题,某些标准库容器(比如std::vector、std::unordered_map)的性能缺陷被永久锁定,委员会无法在不破坏现有二进制的情况下修复。研究显示,同样的工作负载下,C++标准库的P99延迟是Rust的58倍,问题就出在这几个containers上。
理解这种模式的读者应该意识到:C++每推出一个新特性,都可能内置了“用下一代替换它”的种子。
编注:素材来自Hacker News转发的技术博客,信源侧重技术分析与历史演进,涵盖C++11至C++26期间的特性更迭记录,可验证性强。