能否从类型不匹配的指针构造C++引用?
问题解答
你的理解部分正确,但细节上需要纠正:
- 首先,构造
T& rt = *t;这个操作本身就属于未定义行为,原因如下:- 初始化引用时必须对指针
t进行解引用操作(*t),而根据C++标准,reinterpret_cast<T*>(&u)得到的指针t并不指向一个有效的T类型对象。解引用这类不指向对应类型有效对象的指针,本身就触发未定义行为——不管你后续是否通过引用rt访问对象内容。 - C++标准要求引用必须绑定到一个有效的同类型对象(或符合规则的特殊情况,比如派生类对象绑定到基类引用,但这里显然不适用)。用非
T类型的对象u对应的T*指针解引用来初始化T&,本质是试图将引用绑定到不存在的T对象上,这直接违反了引用初始化的规则,属于未定义行为。
- 初始化引用时必须对指针
简单来说:哪怕你完全不使用rt,仅仅是T& rt = *t;这一行代码,就已经触发了未定义行为,你的核心结论(不能这样构造rt)是对的,但第一个理由里的“访问”表述不够准确——问题出在解引用本身就是非法操作,而非后续的访问动作。
内容的提问来源于stack exchange,提问作者Brad Spencer
相关产品推荐
相关产品推荐

