MSVC(std:c++14)初始化右值引用报错问题咨询
问题分析与解答
这是MSVC在C14模式下严格遵循旧版C标准规则导致的行为,并非你的理解有误——GCC与Clang在C++14模式下实际做了超出标准的扩展实现。
核心标准规则差异
- C++14及更早版本:只有当引用直接绑定到完整的prvalue临时对象时,才会触发临时对象的生命周期延长。如果引用绑定到prvalue的非静态数据成员(子对象),标准并不要求延长原prvalue的生命周期。此时
getA()返回的临时A对象会在表达式结束时立即销毁,rr会绑定到已销毁对象的成员,属于未定义行为。MSVC在C++14模式下严格执行这一规则,因此报错阻止这种危险操作。 - C++20及以后版本:C标准修改了这一规则,当引用绑定到prvalue的子对象时,会将整个prvalue临时对象的生命周期延长至引用的生命周期。这就是MSVC启用C20后可以正常编译的原因。
C++14下的合法替代方案
如果需要在C++14模式下实现类似逻辑,可以先将整个prvalue临时对象绑定到右值引用,再访问其成员,确保临时对象生命周期被延长:
int main() { A &&temp = getA(); // 绑定完整prvalue,生命周期延长 R &&rr = temp.r; // 访问有效状态下的成员 }
内容的提问来源于stack exchange,提问作者Andrew Feng
相关产品推荐
相关产品推荐

