为什么我可以从(*迭代器(执行operator&
,但不能复制值(*迭代器(?
std::vector<int> v; // yes, container is empty
for (int i = 0; i < 10; ++i) {
auto it = v.begin();
std::cout << &*(it) << std::endl; // 0 <- why not EXC_BAD_ACCESS?
auto value = *(it); // EXC_BAD_ACCESS
auto address = &value;
}
v
为空,因此v.begin() == v.end()
和取消引用it
未定义。
理论上,两者都有未定义的行为,任何情况都可能发生。
在实践中,&*(it)
不访问任何存储器;你不需要通过读取内存中的某个位置来确定该位置是什么。
(类似地,你可以在不输入的情况下计算出房子的地址,而房子甚至不必存在。(
另一方面,复制一些东西,确实需要你阅读该东西是什么。