Modern C++ Note

被弃用的特性

  1. char *str = "Hello World"; // use "const char *" instead
  2. bool a; a++;
  3. auto_ptr => unique_ptr
  4. C++98 异常说明 (?)
  5. 如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了
  6. C 语言风格的类型转换

语言可用性强化

常量

  • nullptr: 为了解决 NULL 的模糊性。

    NULL 如果实现为 ((void *)0),因为 C++ 编译器不支持 (void *) 隐式转换为其它指针类型,在 char *s = NULL 这种地方会出问题。

    所以只好在 C++ 中定义 NULL 为 0。但在重载调用时会有反直觉的情况发生:

    1
    2
    3
    void foo (int a) { /* do something */ }
    void foo (char *a) { /* do something */ }
    foo(NULL); // will call `foo(int)` instead of `foo(char)`

    引入 nullptr,其类型为 nullptr_t,能够隐式转换为任何指针和成员指针类型,也可以进行相等和不等比较。

  • constexpr:常量表达式(C++11、C++14)

    constexpr 修饰可以作用在函数和变量上,用来让编译器「明确验证」它是一个常量表达式。

    常量表达式之间可以传递(C++11)

    constexpr 函数可以在内部使用局部变量、循环和分支等简单语句(C++14)

    • 为了和 C++11 兼容,可以都用 a : b ? c 来作判断,不过就不能有循环了(?)…

变量及其初始化

  • ifswitch 的括号中可以定义临时变量(C++17)

    1
    2
    3
    4
    5
    // 将临时变量放到 if 语句内
    if (const std::vector<int>::iterator itr = std::find(vec.begin(), vec.end(), 3);
    itr != vec.end()) {
    *itr = 4;
    }
  • 初始化列表和 std::initializer_list<>(C++11)