c++ - 在命名返回值上使用 std::move 来保证不复制?
问题描述
更新:更明确地说,避免误解:我要问的是,在返回命名值的情况下,C++17 标准是否保证如果我在 std::move 上执行移动构造函数将被调用返回值?我知道如果不使用 std::move,编译器是允许但不是必需的,完全省略复制和移动构造函数,直接在调用函数中构造返回值。在我的示例中,这不是我想要做的,我想要保证。
考虑
class A; // Class with heap-allocated memory and 'sane' move constructor/move assignment.
A a_factory(/* some args to construct an A object */)
{
// Code to process args to be able to build an A object.
A a(// args); // A named instance of A, so would require non-guaranteed NRVO.
return std::move(a);
}
void foo()
{
A result = a_factory();
}
在这种情况下,C++ 标准是否保证在构造对象时不会发生复制result
,即我们是否保证了移动构造?
我确实理解在返回值上显式 std::move 的缺点,例如在类 A 不可移动的情况下,即使类中没有移动构造函数,我们也无法进行临时对象的后期实现并获得 0 副本。但我的具体问题是——我来自硬实时背景,并且目前没有得到标准保证的 NRVO 状态并不理想。我确实知道 C++17 强制(未命名)RVO 的 2 个特定情况,但这不是我的问题。
解决方案
推荐阅读
- javascript - 禁用按钮一段时间
- apache-kafka - Kafka 流 - 当事件发生的时间相距很远时加入流
- python - 如何从熊猫数据框中删除不在列表中的某些值?
- node.js - mongoose中查询子文档的子文档
- android - 如何在按下按钮时消除声音android
- java - 空指针异常(循环遍历对象数组)
- firebase - 无法从 Firebase 存储下载调整大小的图像
- html - 用点替换滚动条
- arrays - 从 vue 数据对象中的数组中获取数组长度
- python - 如何使用 Python Paramiko 通过 SSH 连接到 Cisco 交换机