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

C++14中RVO与已删除移动构造函数相关技术问询

最近几天我一直在钻研(N)RVO相关的知识,刚好梳理到拷贝省略(copy elision)这块,就把C++14里的规则给大家理清楚:

C++14 拷贝省略核心规则

编译器允许但不要求省略类对象的拷贝构造及(C++11起新增的)移动构造,即便对应的拷贝/移动构造函数和析构函数存在可观测的副作用。

这本质上是一项编译器优化,但有个关键约束:即便该优化生效、实际没调用拷贝/移动构造函数,相关的构造函数仍必须存在且可访问——就好像完全没做这个优化一样。

举个直观的代码例子帮大家理解:

#include <iostream>
struct TestObj {
    TestObj() { std::cout << "执行默认构造函数\n"; }
    TestObj(const TestObj&) { std::cout << "执行拷贝构造函数\n"; }
    TestObj(TestObj&&) { std::cout << "执行移动构造函数\n"; }
};

TestObj generateObj() {
    return TestObj();
}

int main() {
    TestObj myObj = generateObj();
}

在C++14标准下,编译器有权省略generateObj返回时的移动构造,以及main里的拷贝/移动构造,最终输出可能只有执行默认构造函数。但如果我们把TestObj的拷贝构造函数设为private,哪怕编译器能跳过它,编译阶段还是会直接报错——因为规则要求这些构造函数必须是可访问的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:24:47