C++引用是别名。这样做的效果是,对指针的解引用不一定发生在它们出现的地方,它们发生在它们被评估的地方。对一个对象的引用不会评估该对象,它会对其进行别名。使用参考是评估对象的东西。 C++不能保证引用是有效的;如果是这样,所有的C++编译器都会中断。这样做的唯一方法是通过引用消除动态分配的所有可能性。在实践中,假设是一个引用是一个有效的对象。由于* NULL未定义为&无效,因此对于p = NULL,* p也未定义。 C++的问题是* p将被有效地传递给一个函数,或者延迟到它的评估,直到实际使用该引用为止。认为它是未定义的不是提问者问题的要点。如果它是非法的,编译器会强制执行它,标准也是如此。我也没有意识到这一点。
int &r = *j; // aliases *j, but does not evaluate j
if(r > 0) // evaluates r ==> *j, resulting in dereference (evaluate j) at this line, not what some expect
;
1)可以测试混叠NULL指针的引用,& r是简单地&(无论ř别名)(编辑)
2)当通过一个 “引用” 指针(* I )作为参考参数,取消引用不会发生在调用网站,它可能永远不会发生,因为它是引用(引用是别名,而不是评估)。这是参考文献的优化。如果它们在调用点进行评估,编译器会插入额外的代码,或者它会是一个按值调用,性能比指针低的调用。
是的,引用本身不是NULL,它是无效的,就像* NULL是无效的。这是推迟评估解引用表达式与声明不可能具有无效引用不一致的原因。
#include <iostream>
int fun(int & i) {
std::cerr << &i << "\n";
std::cerr << i << "\n"; // crash here
}
int main() {
int * i = new int();
i = 0;
fun(*i); // Why not crash here? Because the deref doesn't happen here, inconsistent, but critical for performance of references
}
编辑:改变了,因为它已经被误解为建议用于测试的参考,不是我想证明我的例子。我只想证明无效的参考。
相关:http://stackoverflow.com/questions/1919608/checking-for-null-before-pointer-使用/ 1921403#1921403。 – 2010-03-26 16:50:07
“我怎么知道对象的内存在你初始化引用后没有被释放/删除。”你怎么知道某人没有为你的类型“reinterpet_cast”一些完全不正确的对象,并将其作为参考传递给它?或者破坏了他们物体中的记忆,然后传给你?在C和C++中,你不必依靠你的调用者来做一个muppet。如果他们做了一些语言定义为无效的东西,比如解引用一个空指针或者删除一个对象,但是保留对它的引用,那么这就是他们的错误,他们可以调试它。 – 2010-03-26 16:52:50