例如,stdlibc ++具有以下内容: unique_lock& operator=(unique_lock&& __u) { if(_M_owns) unlock(); unique_lock(std::move(__u)).swap(*this); __u._M_device = 0; __u._M_owns = false; return *this; } 为什么不直接将这两个__u成员分配给* this? 不交换意味着__u被分配了*这个成员,只是以后再分配0和false …在这种情况下交换是做不必要的工作。 我错过了什么? (unique_lock :: swap只是在每个成员上执行std :: swap)
在复制和交换成语的美丽答案有一段代码,我需要一点帮助: class dumb_array { public: // … friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // … }; 他又加了一张纸条 还有其他的说法,我们应该专门为我们的typesstd :: swap,提供一个在一个自由function交换,一个类交换,但这是不必要的:任何正确使用交换将通过一个非限定的调用,我们的function将通过ADLfind。 一个function就可以了。 和friend我有点“不友好”的说法,我必须承认。 所以,我的主要问题是: 看起来像一个免费的function ,但它的内部类体呢? 为什么不是这个swap静态 ? 它显然不使用任何成员variables。 “任何适当的交换使用将通过ADLfind交换” ? ADL将search命名空间,对吗? 但是,它也看内部类? 或者在这里friend进来? 副题: 用C ++ 11,我应该用noexcept标记我的swap吗? 用C ++ 11和它的范围 ,我应该把friend iter begin()放在friend iter begin()和friend […]
这个成语是什么,什么时候使用? 它解决了哪些问题? 当使用C ++ 11时,习语是否改变? 虽然在很多地方都有提到,但我们并没有什么特别的问题和答案,所以就是这样。 这是以前提到的地方的部分列表: 什么是你最喜欢的C + +编码风格的习惯用法:复制交换 在C ++中复制构造函数和=运算符重载:是一个常用函数吗? 什么是复制elision和它如何优化复制和交换习惯用法 C ++:dynamic分配一个对象数组?