考虑这样的代码:
std::vector<int> vec { 1, 2, 3 };
auto addr = &*vec.end();
Run Code Online (Sandbox Code Playgroud)
或简化:
int* ptr = 0;
auto addr = &*ptr;
Run Code Online (Sandbox Code Playgroud)
显然auto val = *ptr;会出现段错误.因此&*ptr,不会以相同的方式访问内存.为什么会这样?标准中是否有特定条目?
取消引用返回值std::vector::end()是未定义行为的原因.如果你这样做,试图理解会发生什么是没有意义的.
来自http://en.cppreference.com/w/cpp/container/vector/end:
该元素充当占位符; 尝试访问它会导致未定义的行为.
回覆.第二部分,我在C++ 11标准中唯一能找到的是:
5.3.1一元运算符
1一元运算
*符执行间接:应用它的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是引用表达式指向的对象或函数的左值.如果表达式的类型是"指向T",则结果的类型为"T."[ 注意:可以取消引用指向不完整类型(cvvoid除外)的指针.由此获得的左值可以以有限的方式使用(例如,初始化参考); 这个左值不能转换为prvalue,见4.1.- 结束说明 ]
取消引用NULL指针的结果似乎未指定.