typedef using 定义别名与复杂类型的解析

类型别名

using定义别名的用法和typedef区别不大,但是using可以使用模板,比如:

1
2
template<typename T>
using ArrayPointer = T(*)[10];

解析复杂类型

C++复杂类型的解析遵循以下顺序,方括号和圆括号(即,标识符右侧的修饰符)优先于星号(即,标识符左侧的修饰符)。 方括号和圆括号具有相同的优先级并且都是从左到右关联。 在完全解释声明符之后,将应用类型说明符以作为最后一步。 通过使用圆括号,您可以重写默认关联顺序和强制实施特定解释。 但是,绝不要单独在标识符名称两边使用圆括号。 这可能会被错误解释为参数列表。

解释复杂声明符的一个简单方法是通过下列 4 个步骤“从里到外”地读取它们:

  1. 从标识符开始并直接查找方括号或圆括号(如果有)的右侧。
  2. 解释这些方括号或圆括号,然后查找星号的左侧。
  3. 如果在任何阶段遇到一个右圆括号,请返回并将规则 1 和 2 应用于圆括号内的所有内容。
  4. 应用类型说明符。
1
2
3
char *( *(*var)() )[10];
^ ^ ^ ^ ^ ^ ^
7 6 4 2 1 3 5

在此示例中,步骤是按顺序编号的,并且可以按如下方式解释:

  1. 标识符 var 声明为
  2. 指向以下内容的指针
  3. 返回以下内容的函数
  4. 指向以下内容的指针
  5. 包含 10 个元素的数组,这些元素分别为
  6. 指向以下内容的指针
  7. char 值。

参考资料

探究C++迭代器失效问题

起因

在LeetCode上做题的时候遇到一道需要手动实现deque的题目,因为需要通过一个哈希表经过O(1)的时间来访问到deque中的每个节点。于是机智的我想到了通过iterator来访问节点的方法,但是出乎意料的是出现了内存访问问题。最后定位到问题出在通过哈希表中储存的iterator来访问内存中的内容时,指针已经失效了。

阅读更多