为什么此示例打印:
#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{}会导致复制?
发布于 2015-03-09 14:24:16
在第一种情况下,复制省略是有效的,因为您正在从临时值初始化赋值操作符的参数;可以省略临时参数,直接构造参数。用标准的话说,省略的标准之一是:
当没有绑定到引用的临时类对象被复制/移动到具有相同cv非限定类型的类对象时,可以通过将临时对象直接构造到省略复制/移动的目标中来省略复制/移动操作。
在第二种情况下,您不是从临时对象初始化它,而是从现有对象初始化它。它已经被构造,在一个与目标不同的位置,所以上面描述的优化是无法完成的。
https://stackoverflow.com/questions/28944047
复制相似问题