使用移动时不会发生复制省略
Copy-elision doesn't happen when using move
为什么这个例子打印:
#include <iostream>
struct X
{
X() = default;
X(X const&) { std::cout << "copy-constructorn"; }
X(X&&) { std::cout << "move-constructorn"; }
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)
都是右值,那么为什么只分配给X{}
会导致复制省略?
Copy elision 在第一种情况下有效,因为您正在从临时初始化赋值运算符的参数;可以省略临时,而是直接构造参数。用标准的话说,省略的标准之一是:
当尚未绑定到引用的临时类对象将被复制/移动到具有相同 CV-UNQUALIFIED 类型的类对象时,可以通过将临时对象直接构造到省略的复制/移动的目标中来省略复制/移动操作
在第二种情况下,您不是从临时对象初始化它,而是从现有对象初始化它。它已经在与目标不同的位置构建,因此无法进行上述优化。
相关文章:
- 使lambda不可复制/不可移动
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 复制和移动构造函数是自动好友吗?
- emplace_back和push_back给出错误'double free or corruption (fasttop)'尽管定义了复制和移动构造函数
- 在继承层次结构中复制和移动
- "assembly language" "mov"意味着复制还是移动?
- 如何初始化非静态模板成员变量从临时工开始,即而无需复制或移动
- 防止作用域枚举可复制/可移动
- 使用 "using" 关键字继承基类的复制和移动构造函数
- 标准::atomic_应该如何...<std::shared_ptr>用于线程安全类的复制和移动操作?
- 是否可以在基类中删除复制和移动构造函数/分配运算符
- 自 C++17 以来,复制 elision 不需要存在和访问复制或移动 CTOR
- 在MSVC上的数组初始化期间,destructor在不复制或移动构造方的情况下调用
- 计算 std::vector 的复制和移动次数
- 如何使用模板复制和移动构造函数和赋值运算符?
- 为什么map的元素不需要复制或移动构造函数,而vector需要?
- 复制和移动构造函数之间的效率差异
- 带有模板复制和移动构造函数的C++类型擦除
- 每次复制实现移动分配的非 const 对象时,我是否总是获得移动语义