You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:50:02