首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制-省略在使用移动时不会发生

复制-省略在使用移动时不会发生
EN

Stack Overflow用户
提问于 2015-03-09 14:09:42
回答 1查看 78关注 0票数 2

为什么此示例打印:

代码语言:javascript
复制
#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调用移动构造函数分配

X{}std::move(y)都是rvalue,那么为什么只分配给X{}会导致复制?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-09 14:24:16

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

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

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28944047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档