【发布时间】:2021-12-30 06:39:17
【问题描述】:
许多关于 const 迭代器 (example) 的帖子,但没有关于循环上下文的帖子,例如:
for (const auto it: container) { ... }
当我开始实施时,鼓励编译器抱怨缺少begin和end,希望这些抱怨能够指导我填写在丢失的部分。我错了。以下代码编译得很好,尽管它肯定缺少 operator++ 和 operator!= 的等效项:
#include <iostream>
template<class T> class List { public:
const T *head;
const List<T> *tail;
List(const T *h, const List<T> *t):head(h),tail(t){}
const T *operator*() const { return head; } };
template<class T> const List<T> *begin(const List<T> *l) { return l; }
template<class T> const List<T> *end (const List<T> *l) { return nullptr; }
class Person { public: int age; Person(int a):age(a){} };
typedef List<Person> Persons;
int main(int argc, char **argv) {
Person *p1 = new Person(16);
Person *p2 = new Person(27);
Person *p3 = new Person(38);
Persons *persons = new Persons(p1,
new Persons(p2,
new Persons(p3, nullptr)));
for (const auto p: persons) { std::cout << (*p)->age << "\n"; }
return 0; }
这段代码是怎么编译的?
【问题讨论】:
-
这里没有迭代器。而 range for 循环只是普通 for 循环的简写语法
-
++和!=是为所有指针类型定义的 -
我不明白为什么
persons,一个Persons*指针,被视为一个有效的范围表达式。唯一看起来可以应用的case 是将其视为大小未知的数组类型。 -
这是因为定义了 begin() 和 end() 函数,它们接受 List* 作为参数。