为什么打印此示例:
#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] 删除。
我来说两句