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

为何C++返回T时不对std::optional<T>执行RVO优化?

为什么返回T类型对象时,C++不对std::optional执行RVO?

我遇到了一个关于返回值优化(RVO)的问题:当返回T类型对象时编译器能正常触发RVO,但返回std::optional<T>时,直接返回T的临时对象却无法触发优化,必须手动构造std::optional<T>再返回才能让编译器执行RVO,示例代码如下:

struct Bar {};
std::optional<Bar> get_bar()
{
    return Bar{}; // 此处调用Bar的移动构造函数,未执行RVO
}
Bar get_bar2()
{
    return Bar{}; // 未调用移动构造函数,执行了RVO
}
std::optional<Bar> get_bar_rvo()
{
    std::optional<Bar> opt;
    opt.emplace();
    return opt;  // 未调用移动构造函数,执行了RVO
}

上述代码中,get_bar2顺利触发了RVO,没有调用任何构造函数;但get_bar却会调用Bar的移动构造函数,无法触发RVO。只有像get_bar_rvo那样手动构造std::optional<T>对象再返回,才能让编译器执行RVO,但这样写代码会变得冗长繁琐。

根据cppreference文档,我知道get_bar不符合强制省略复制/移动操作的要求:

在初始化对象时,当初始化表达式是与变量类型(忽略cv限定符)相同的类类型的纯右值时:

因为std::optional<T>和T并非相同类类型,所以RVO不是强制要求的。但我认为对std::optional<T>的这种场景执行RVO应该非常简单且实用,没必要手动写get_bar_rvo这种繁琐的代码。为什么我的编译器不能像优化get_bar2一样优化get_bar?

编译环境:MacOS

Apple clang version 13.1.6 (clang-1316.0.21.2.5)
Target: arm64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

编译选项:-std=c++17 -O3

内容的提问来源于stack exchange,提问作者Bin Yan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:30:39