copy-and-swap相关内容
这个成语是什么,应该在什么时候使用?它解决了哪些问题?使用 C++11 时习语会发生变化吗? 虽然在很多地方都提到过,但我们没有任何单数的“它是什么"问题和答案,所以在这里.以下是之前提到的部分地点列表: 你最喜欢的 C++ 编码风格成语是什么:复制交换 复制C++ 中的构造函数和 = 运算符重载:通用函数是否可行? 什么是复制省略和它如何优化复制和交换习语 C++:动态分配对象
..
我正在阅读复制和交换. 我尝试阅读 Copy Elision 上的一些链接,但无法正确理解它的含义.有人可以解释一下这个优化是什么,特别是下面的文字是什么意思 这不仅仅是一个方便的问题,而且实际上是一种优化.如果参数 (s) 绑定到左值(另一个非常量对象),则在创建参数 (s) 时会自动制作该对象的副本.但是,当 s 绑定到右值(临时对象,文字)时,通常会省略副本,从而节省对复制构造函
..
如此答案中所述,复制和交换习语的实现方式如下: class MyClass{私人的:大类数据;UnmovableClass *dataPtr;民众:我的课(): data(), dataPtr(new UnmovableClass) { }MyClass(const MyClass& 其他): 数据(other.data), dataPtr(new UnmovableClass(*other.d
..
我已经看到它说一个 operator= 被写成一个相同类型的按值参数在 C++11 中同时用作复制赋值运算符和移动赋值运算符: Foo&运算符=(Foo f){交换(f);返回 *this;} 替代方案的行数是两倍多,代码重复很多,并且可能出错: Foo&运算符=(const Foo& f){富 f2(f);交换(f2);返回 *this;}Foo&运算符=(Foo&& f){Foo f2(
..
这个成语是什么,什么时候用?它解决了哪些问题?使用 C++11 时习语会发生变化吗? 虽然在很多地方都提到过,但我们没有任何单一的“它是什么"的问题和答案,所以就在这里.这是之前提到的地方的部分列表: 您最喜欢的 C++ 编码风格习语是什么:复制交换 复制C++ 中的构造函数和 = 运算符重载:是否可以使用通用函数? 什么是复制省略和它如何优化复制和交换习语 C++:动态分配对象
..
我最近在 StackOverflow 上阅读了关于 什么是复制和-的答案交换习语?并且知道复制和交换习语可以 避免代码重复,并提供强大的异常保证. 然而,当我查看 SGI STL deque 实现,我发现它没有使用这个成语.我想知道为什么不,如果这个习语有点像“最佳实践"? deque&运算符 = (const deque& __x) {const size_type __len
..
如果我有诸如此类的课程 class Foo{ public: Foo(){...} Foo(Foo && rhs){...} operator=(Foo rhs){ swap(*this, rhs);} void swap(Foo &rhs); private: Foo(const Foo&); // snip: swap code }; void s
..
为了正确处理对象复制,经验法则是三人制规则.在C ++ 11中,移动语义是一回事,因此它是五人制.但是,在围绕此处和互联网的讨论中,我也看到了对那么四个(半个)规则到底是什么?需要实现哪些功能,每个功能的主体应该是什么样?一半是哪个功能?与五法则相比,这种方法是否有任何弊端或警告? 这是一个类似于我当前代码的参考实现.如果这是不正确的,那么正确的实现将是什么样子? //I unders
..
测试新的移动语义. 我刚刚问过我关于Move构造函数的问题.但事实证明,问题实际上是当您使用标准的“复制和交换"习惯用语时,“移动分配"运算符和“标准分配"运算符发生冲突. 这是我正在使用的课程: #include #include class String { int len; char*
..
考虑经典的虚拟继承菱形层次结构。我想知道什么是在这种层次结构中的复制和交换惯用语的正确实现。 示例有点人为 - 它是不是很聪明 - 因为它会发挥良好的默认复制语义为A,B,D类。但只是为了说明问题 - 请忘记示例弱点并提供解决方案。 所以我有从2个基类派生的类D(B 1,B 2) - 每个B类都从A类继承。每个类具有使用复制和交换惯用法的非简单复制语义。最衍生的D类在使用这个习语时有问
..
测试新的移动语义。 我刚刚问了我使用移动构造函数的问题。但是,事实证明,在评论中的问题是,当你使用标准的“复制和交换”成语时,“移动分配”操作符和“标准分配”操作符冲突。 这是我使用的类: #include #include class String { int len; char * data; publ
..
移动赋值运算符通常应声明为noexcept(即在STL容器中存储类型)。但是复制和交换惯例允许在一个单独的代码段中定义复制和移动分配操作符。在这种情况下,如何处理noexcept说明符?复制结构可以抛出,但我怀疑它是否可以违反noexcept指示符。 //考虑到T复制构造函数可以抛出? T& operator =(T other)noexcept; 解决方案 em>呼
..
在对复制和交换惯例的美丽答案中有一段代码我需要一点帮助: class dumb_array { public: // ... friend void swap(dumb_array& first,dumb_array& second)// nothrow { 使用std :: swap; swap(first.mSize,second.mSize); swap(fi
..
如此答案中所述,复制和交换惯用语实现如下: class MyClass { private: BigClass data; UnmovableClass * dataPtr; public: MyClass() :data(),dataPtr(new UnmovableClass){} MyClass(const MyClass& other) :data (ot
..
例如,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 * thi
..
我在阅读复制和互换。 我试过阅读Copy Elision上的一些链接,但无法弄清楚它的含义。可以有人请解释这个优化是什么,特别是下面的文本是什么意思 这不仅仅是为了方便,事实上优化。如果参数绑定到一个左值(另一个非const对象),则在创建参数时自动创建对象的副本。但是,当s绑定到一个右值(临时对象,立即数)时,副本通常会被省略,这会保存对副本构造函数和析构函数的调用。在赋值运算符的早
..
我已经看到它说一个 operator = 被写为采用相同类型的值的参数同时作为复制赋值操作符和移动赋值操作符在C + +11: Foo& operator =(Foo f) { swap(f); return * this; } 其中替代项将是许多行的两倍多重复和潜在错误: Foo& operator =(const Foo& f) { Foo f
..
这个成语是什么,什么时候使用?它解决了哪些问题?当使用C ++ 11时,惯用语是否会改变? 虽然在很多地方都提到过,但我们没有任何奇怪的“什么是”问题和答案,所以这里是。以下是之前提到的地方的部分列表: 复制构造函数和= C ++中的运算符过载:是可能的常见函数吗? 什么是复制elision,以及如何优化复制和交换惯用语 C ++:动态分配对象数组 解决方案 概述 复
..