Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;按价值分配,缺点是什么?_C++_Assignment Operator_Copy Assignment_Move Assignment Operator - Fatal编程技术网

C++ C++;按价值分配,缺点是什么?

C++ C++;按价值分配,缺点是什么?,c++,assignment-operator,copy-assignment,move-assignment-operator,C++,Assignment Operator,Copy Assignment,Move Assignment Operator,最近,我偶然发现了这种模式: class Foo { Foo() = default; Foo(const Foo &) = default; Foo(Foo &&) = default; Foo & operator=(Foo rhs) { swap(rhs); return *this; } }; 仔细观察此模式发现,由于复制省略,此单一赋值函数通过“复制和交换”免费提供移动赋值和复制赋值。既然它如此方便

最近,我偶然发现了这种模式:

class Foo {
   Foo() = default;
   Foo(const Foo &) = default;
   Foo(Foo &&) = default;
   Foo & operator=(Foo rhs) {
      swap(rhs);
      return *this;
   }
};
仔细观察此模式发现,由于复制省略,此单一赋值函数通过“复制和交换”免费提供移动赋值和复制赋值。既然它如此方便,为什么它不是一个“主流模式”。这样做有什么好处吗

注意:没有临时变量的定制复制构造函数可以在更少的步骤中生成操作,但对于这个问题,显式编写围绕交换的复制和移动赋值会带来什么好处

关于问题“”的可能重复,我的问题假设读者已经知道它是什么


感谢

浪费了资源,做了可以轻松实施的事情,尤其是为了一次移动。移动不需要先复制,它们通常会窃取资源,所以为什么要在您可以直接获取的情况下复制所有内容,这通常要快得多?可能复制@ChrisMM Pass by value并不意味着复制。搬家也是一种可能性。“为什么这不是一种‘主流模式’”是什么让你觉得不是?你是在问为什么没有更多的人编写更好的代码仅从C++17开始,复制省略是有保证的。尝试向Foo添加一些成员,如std::vector,并使用MSVC进行编译。