现代 C++ 系列
我的现代 C++ 文章系列的代码。
大多数人认为他们了解生产级使用的 C++,因为他们大学/学院的教学大纲里有教 C++。但他们大多不知道自己学的是哪种标准的 C++。他们学的是 C++ 89,也就是CFront 2.0。大学里的学生被要求使用Turbo C++作为 IDE 来学习 C++,因为它在当时是,或者曾经是,一个很棒的 IDE。由于学术大纲的更新需要很长时间,而且人们并不知道它已经过时,所以大多数人倾向于学习旧的编码风格和过时的功能。
现代 C++ 代表基于 C++11、C++14、C++17、C++20 及未来版本的 C++。
C++11 带来了一场革命。这场革命在 C++14 中得以延续,并将在 C++17 中演变成一场演进。C++ 特性的时间线概述可以清晰地阐明我的观点。
现代 C++ 不仅增强了 C++ 本身的易用性,auto
关键字语义的修改也让其在操作极其复杂的模板类型时更有信心。同时,语言在运行时也做了大量的增强,Lambda 表达式的出现使得 C++ 拥有了“匿名函数”的“闭包”特性,这在现代编程语言(例如 Python/Swift/...)中几乎已经司空见惯,而rvalue
引用的出现则解决了 C++ 长期以来被诟病的临时对象效率问题。
char *
。如果需要char *
用字符串字面常量赋值并初始化 a ,则应使用const char *
或auto
。char *str = "hello world!"; // A deprecation warning will appear
C++98 exception description
、unexpected_handler
、set_unexpected()
和其他相关功能已弃用,应使用noexcept
。
auto_ptr
已被弃用并且unique_ptr
应该被使用。
register
关键字已被弃用,仍然可以使用,但不再具有任何实际意义。
bool
无法再增加
如果某个类具有destructor
,则它为其生成复制构造函数和复制赋值运算符的属性将被弃用。
不推荐使用 C 语言风格的类型转换(即在变量前使用 (convert_type)),而应使用static_cast
、reinterpret_cast
、进行类型转换。const_cast
特别是,一些可以使用的 C 标准库现在在最新的 C++ 标准中已经被弃用,例如<ccomplex>
、和。<cstdalign>
<cstdbool>
<ctgmath>
还有很多,我记不清了。
我的文章中使用的所有代码都可以在Delta456/modern-cpp-series上找到。