常量引用

常量引用可会自动创建一个临时变量,这是一个特性。常量的引用本身就是常量,实际和被引用的已经无关了,因为不可以修改本身的值。

因此引用时可以不用保证类型的匹配;同时也可以直接给引用赋字面值常量。

顶层 const 和 底层 const

注意区分这两种 const,特别是在指针上时。

简单理解: 底层:其所指向的值不可修改 顶层:其自身的值不可以修改

const int *p = nullptr; // 是底层 const,此时 p 所指向的对象的值不可以改
int *const p = nullptr; // 是顶层 const,此时 p 的值不可以改,即不可以改变指向的对象

底层 const 需要匹配,底层 const 可以增加,但不能去除。

constexpr

新内容 constexpr,常量表达式。 constexpr 将其所对应的对象置为了顶层 const。

const int *p = nullptr; // 底层 const
constexpr int *p = nullptr; // 顶层 const

别名

新标准使用 using 来命名别名。

别名的指针会发生一些意外,一定要注意。P.61

using pstring = char *;
char a = 'a';
const pstring cstr = &a; // 顶层 const 
*cstr = 'b'; // ok, 将 a 的值改成 b
cstr = 0; // error, 不可以改变 cstr 的指向

auto

auto 的顶层 const 必须手动指定,底层 const 会手动推断。(引用除外)

const int ci = 1;
auto &r = ci; // ok,这里的 r 是常量的引用,其引用的值不可以更改

decltype 类型指示

只推断不赋值。区别于 auto,包含顶层 const。