std::vector、成员访问运算符和EXC_BAD_access



为什么我可以从(*迭代器(执行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)不访问任何存储器;你不需要通过读取内存中的某个位置来确定该位置是什么。
(类似地,你可以在不输入的情况下计算出房子的地址,而房子甚至不必存在。(

另一方面,复制一些东西,确实需要你阅读该东西是什么。

最新更新