主要观点:作者在其职业生涯中大部分时间从事 C++工作,但对该语言了解越多越感到畏惧,其复杂性导致难以掌控,且个人甚至难以理解全部语言;介绍了 C++中的一些容易被忽视或理解错误的特性,如临时生命周期扩展、指定初始化器、模板消除歧义等,这些特性在不同编译器中可能有不同的行为,导致了一些编译错误和难以调试的问题;最后希望有更干净的 C++继任语言,能在需要时方便使用 C++代码,同时避免其复杂性。
关键信息:
- 临时生命周期扩展:在 C++中,对变量生命周期的考虑很重要,返回局部变量的引用或引用临时表达式可能导致错误,但加上
const可使代码有效,这一特性自 1993 年起成为 C++的一部分。 - 指定初始化器:C++长期没有类似 C99 的指定初始化器功能,直到 C++20 才添加,且与 C 语法不完全一致,如在 GCC7 中编译某些指定初始化器代码时,编译器会忽略索引。
- 模板消除歧义:在 C++中,为使编译器记住方法是模板方法,需在对象上调用方法前加上
template<SPACE>,GCC 会忽略不必要的消除歧义,而 Clang 不允许,两者的这种差异已存在多年。
重要细节:
- 作者在工作中遇到各种与 C++特性相关的问题,如在开发者体验部门处理影响全公司的编译器错误,升级编译器后出现生产环境崩溃等。
- 对于一些复杂的代码和编译器行为,即使是经验丰富的 C++开发者也需要花费时间讨论和研究,如确定编译器错误是真正的 bug 还是语言行为的改变。
- 作者希望有更清洁的 C++继任语言,如 cppfront、carbon 或其他语言,以解决 C++的复杂性问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。