为何含自初始化B引用的代码可编译?该引用的初始化指向是什么?
代码编译原因与引用指向分析
为什么能编译
C语法没禁止在成员初始化时引用正在初始化的成员本身。编译器只做语法层面的检查,这种写法符合语法规则,所以能通过编译,但这属于未定义行为——C标准不保障这段代码的运行结果,只是允许你写出这样的代码而已。
引用实际指向什么
B& b = b;是用成员b自己来初始化这个引用,但问题是,初始化发生时,b作为引用成员还没完成初始化。引用本质是其他对象的别名,这里根本没有合法的B对象可以绑定,最终这个引用会绑定到一个无效的内存地址(或者说绑定到它自身的存储位置,但这没有任何实际意义)。之后要是尝试用这个引用访问B的成员,比如a.b.a,结果完全不可控,可能崩溃、输出垃圾值,或者出现其他离谱的情况。
说白了,这就是个语法合法但逻辑完全错误的写法,引用根本没绑定到任何有效的B实例上。
内容的提问来源于stack exchange,提问作者cjds
相关产品推荐
相关产品推荐

