使用move时不会发生复制删除

模板男孩

为什么打印此示例:

#include <iostream>

struct X
{
    X() = default;
    X(X const&) { std::cout << "copy-constructor\n"; }
    X(X&&) { std::cout << "move-constructor\n"; }

    X& operator=(X)
    {
        return *this;
    }
};

int main() 
{
    X x, y;
    std::cout << "assign from prvalue calls the ";
    x = X{};
    std::cout << "\nassign from xvalue calls the ";
    x = std::move(y);
}

从prvalue进行
赋值调用从xvalue进行赋值调用move构造函数

这两个X{}std::move(y)的右值那么为什么只分配给X{}事业拷贝省音?

迈克·西摩

复制省略在第一种情况下有效,因为您要从临时初始化赋值运算符的参数。可以省略临时变量,而是直接构造参数。用标准的话来说,省略的标准之一是:

当尚未绑定到引用的临时类对象将被复制/移动到具有相同cv-unqualtype类型的类对象时,可以通过将临时对象直接构造到被省略的目标中来省略复制/移动操作复制/移动

在第二种情况下,您不是从临时对象初始化它,而是从现有对象初始化它。它已经被构建在与目标不同的位置,因此无法完成上述优化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java:为什么在使用Stream + Iterator时不会发生ConcurrentModificationException?

Java:为什么在使用Stream + Iterator时不会发生ConcurrentModificationException?

删除原始存储库时,叉子会发生什么?

删除Windows VM时许可证会发生什么?

确保在Elasticsearch中自动索引时不会发生重复

使用POSTMAN时不会发生CORS问题

当您从最近的任务中删除任务时,会发生什么?

我需要时不会发生HTML多个onclick事件

使用Typesafe Config不会发生替换

使用PyCharm导入模块时出现错误,而使用Jupyter Notebook时不会发生错误

Google Kubernetes引擎-从Redis Master到Slave复制不会发生

从对象“删除”多个属性而不会发生突变

在swiftUi中删除并添加模型中的数据时,不会发生过渡

即使在禁用RVO时定义了move构造函数,也会发生对象复制

useEffect无限循环仅在测试时发生,否则不会发生-尽管使用useReducer

使用grails事件推送插件不会发生websocket连接

使用Zurb Foundation和wordpress不会发生冲突

在Rails中使用jquery-ujs时不会发生Ajax回调

在NestedScrollView中使用Multiple Recyclerview不会发生视图回收

任务死锁不会发生

使用std :: remove()从向量中删除多个值时,为什么会发生跳过?

使用 NetBeans 在 MS Access 数据库中不会发生插入删除更新

Python:当值来自配置时不会发生解密

使用 Cypress 下拉选择值不会发生

单击链接时不会发生任何操作

使用模板天蓝色管道时不会发生变量替换

偶尔注销时不会删除用户会话。为什么会发生这种情况?

customHook 中的 useEffect 有时不会发生(原因不明)。使用 useRef

Pydantic - 验证不会发生