29得票1回答
何时使用过载引用传递(l-value和r-value)优于值传递?

我看到有人说在 C++11 中,编写以同一类型参数为值的operator=可同时充当复制赋值运算符和移动赋值运算符: Foo& operator=(Foo f) { swap(f); return *this; } 如果采用另一种方法,可能需要两倍以上的代码行数,...

19得票2回答
如何在使用复制交换技法的赋值操作符中使用noexcept?

移动赋值运算符通常应该声明为noexcept(即在STL容器中存储类型)。但是,复制并交换惯用法允许定义单个代码段中的复制和移动赋值运算符。在这种情况下,如何处理noexcept限定符?复制构造函数可能会抛出异常,但我怀疑它是否违反noexcept限定符。 // Is it correct ...

28得票3回答
四(加半个)的规则是什么?(关于IT技术的问题)

为了正确处理对象复制,原则是三法则。在C++11中,移动语义是一种技术,所以现在是五法则。然而,在这里和互联网上的讨论中,我也看到了参考四个半法则的内容,它是五个法则和复制-交换惯用法的组合。 那么,什么是四个半法则?哪些函数需要被实现,每个函数的主体应该是什么样子的?哪个函数是半个?与五个...

34得票3回答
移动赋值与标准复制交换不兼容。

测试新的移动语义。我刚刚问了一个有关移动构造函数的问题。但是在评论中,事实证明问题实际上是当您使用标准的“复制和交换”惯用语时,“移动赋值”运算符和“标准赋值”运算符会发生冲突。这是我正在使用的类:#include <string.h> #include <utility&g...

77得票4回答
为什么有些人在移动赋值时使用交换(swap)?

例如,stdlibc++拥有以下内容:unique_lock& operator=(unique_lock&& __u) { if(_M_owns) unlock(); unique_lock(std::move(__u)).swap(*...

26得票3回答
C++11中,Copy-and-Swap习惯用法是否应该变成Copy-and-Move习惯用法?

如 这个答案 所解释的那样,复制并交换技巧的实现如下: class MyClass { private: BigClass data; UnmovableClass *dataPtr; public: MyClass() : data(), dataPt...

7得票4回答
使用纯虚类进行复制和交换习语

我正在尝试使用纯虚函数和“复制并交换”惯用语来实现虚拟类,但是我遇到了一些问题。由于我在类A的赋值运算符中创建了实例,其中包含纯虚函数,所以代码无法编译。 有没有办法同时使用纯虚函数和“复制并交换”惯用语? class A { public: A( string name) : ...

13得票2回答
何时不能使用复制并交换惯用语(copy-and-swap idiom)?

在读完这个关于复制和交换惯用语的问题之后,我阅读了这个内容,并发现其中(2)下的说明:class_name & class_name :: operator= ( const class_name & ) (2) (2) 当不能使用复制并交换惯用语时,典...

10得票3回答
复制交换惯用语的低效性问题?

我正在测试一个类内部有一个std::vector数据成员的代码。该类既可以复制,也可以移动,并且使用拷贝交换技巧实现了operator=,具体请参见此处。 如果有两个vector,比如大容量的v1和小容量的v2,并且将v2复制到v1(v1 = v2),则分配给v1的大容量将保留。这是有意义的...

28得票2回答
复制和移动习语?

通过使用复制和交换习语,我们可以轻松实现具有强异常安全性的复制赋值: T& operator = (T other){ using std::swap; swap(*this, other); return *this; } 然而,这需要T是可交换的Swa...