MSN*_*MSN 1 c++ standards reference
编辑:这与C++标准核心语言活动问题上的活动问题232有关
所以真正的问题是标准如何允许间接通过空指针?
请考虑以下代码:
struct a { int x; };
struct b { int y; };
struct c: a, b { };
b *f(c *pointer_to_c) { return pointer_to_c; }
Run Code Online (Sandbox Code Playgroud)
f(...)必须测试是否pointer_to_c是NULL,如果是,则返回NULL.(无论你如何施放指针,NULL指针总是一个NULL指针.)
现在,请考虑以下事项:
b *f_ref(c &reference_to_c) { return &reference_to_c; }
Run Code Online (Sandbox Code Playgroud)
第一个问题:是否f_ref需要检查是否&reference_to_c是NULL?第二个问题:如果C++最终通过空指针定义间接行为,这f_ref是否必须检查NULL?(我想答案取决于标准允许的内容,即,如果它表示"为多重继承而未定义对基类进行NULL引用",那么答案显然是否定的.)
对于最后一个难题,现在考虑一下:
const b *f_const_ref(const c &reference_to_c) { return &reference_to_c; }
Run Code Online (Sandbox Code Playgroud)
是否f_const_ref必须检查&reference_to_c到NULL?顺便说一句,在VC++ 2010中,所有三个函数都经过优化f,即所有三个函数都测试输入NULL.
因此,鉴于您无法在定义良好的程序中传递空引用,这是否意味着如果C++标准最终允许间接通过空指针,则它不会导致表达式或子表达式,否则将绑定到空指针并创建空引用?换句话说,如果标准允许间接通过空指针,那么它们允许的各种方式是什么?
取消引用NULL指针无效(即未定义的行为).
因此永远不可能从NULL(在有效代码中)获取引用.
因此,您获得的任何引用都将永远不会为NULL,因此您无需检查它.
第一个问题:f_ref是否需要检查&reference_to_c是否为NULL?
没有.
第二个问题:如果C++最终通过空指针定义间接行为,这是否意味着f_ref必须检查NULL?
确实如此.它未定义的行为.因此任何进一步的推测都是毫无价值的.
对于最后一个难题,f_const_ref是否必须检查&reference_to_c为NULL?
没有.