为什么绑定到右值的const左值引用不会产生悬空引用?
问题本质是C++的临时对象生命周期延长规则,仅对引用生效,对指针无效
const auto& foo = std::string("foo");符合标准的生命周期延长规则:当const左值引用(C++11新增的右值引用也适用)直接绑定到临时对象时,该临时对象的生命周期会被拉长到和引用的生命周期完全一致,不会在表达式求值结束后就销毁,所以这段代码完全合法,不会报错。const auto* foo = &(std::string("foo"));没有对应的规则保护:取临时对象地址的操作不会触发任何生命周期延长逻辑,std::string("foo")这个临时对象在当前完整表达式求值结束后就会被销毁,你拿到的指针直接变成野指针,属于标准明确的未定义行为,编译器检测到这种明显的非法操作就会直接报错。
你之前把引用理解为语法糖封装的非空指针,这个认知在大部分场景下是成立的,但唯独在绑定临时对象的场景下,C++标准给了引用独有的生命周期延长的特殊待遇,这是指针没有的特性,所以两者的行为会出现差异。
另外要注意生命周期延长只在引用直接绑定临时对象时才生效,如果是间接绑定的场景不会触发,比如const auto& foo = std::string("foo").c_str();就不会延长临时string的生命周期,依然会出现非法访问。
内容的提问来源于stack exchange,提问作者jwezorek
相关产品推荐
相关产品推荐

