问题标签 [copy-and-swap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
104 浏览

c++ - 为什么我需要复制和交换习语?

我看不出在 C++11 中使用复制和交换习语有什么意义。如果我需要一个句柄,我可以使用unique_ptror shared_ptr。如果我需要一个对象集合,我可以只使用vectoror string

对我来说,复制和交换习语听起来像是一个毫无意义的思考练习,充满了等待发生的错误。

  • 担心异常

  • 我是否需要担心自我分配?过早优化是万恶之源

  • 我错过了swap在班级的构造函数中调用某个地方的地方吗?

  • 也许我忘记了delete某个地方?

假设我有一个令人信服的理由来使用手动内存管理。还有分配器,交换指针等。

现代 C++中,我什么时候需要进行手动内存管理(newdelete)wrt 复制和交换?

0 投票
3 回答
95 浏览

c++ - 为什么我们在使用赋值运算符时要使用复制和交换?

使用复制和交换方法时,我对赋值运算符有疑问。

假设我们有一个很好的复制构造函数,它可以深度复制所有指针和动态分配的变量。

那么,上面的代码和下面的代码有什么区别呢?

由于我们有一个很好的复制构造函数,我认为另一个对象 s 是在 operator= 函数中创建的。那么,使用非抛出交换功能有什么意义呢?

0 投票
1 回答
340 浏览

c++ - 模板类的友元函数中的链接错误

我有模板类节点,为了遵循复制和交换习语,我正在尝试编写swap函数friendNode

我的代码是:

Node.h

Node.tpp

当我从Source.cpp

我收到以下链接错误

0 投票
1 回答
86 浏览

c++ - 复制交换惯用语:如果我更改班级成员怎么办?

我有一堂课

为了使用复制交换习语,我创建了函数

如果稍后我更改了我的类并删除了 member a,那么编译器会在swap函数中抱怨,这很好。

但是如果我添加一个新成员,我的swap功能就不再正确了。为了不忘记将新成员添加到交换功能,我该怎么做?

0 投票
2 回答
3487 浏览

c++ - 复制和移动成语?

通过使用Copy & Swap习惯用法,我们可以轻松实现具有强大异常安全性的复制分配:

但是,这T需要Swappable。如果std::is_move_constructible_v<T> && std::is_move_assignable_v<T> == true感谢std::swap.

我的问题是,使用“复制和移动”习语有什么缺点吗?像这样:

前提是你实现了移动赋值,T因为显然你最终会得到无限递归。

这个问题与 Copy-and-Swap 成语是否应该成为 C++11 中的 Copy-and-Move 成语不同?因为这个问题更笼统,并且使用移动赋值运算符而不是实际手动移动成员。这避免了在链接线程中预测答案的清理问题。

0 投票
1 回答
353 浏览

c++ - 如何正确地为抽象类制作深拷贝?

我正在开发一个碰撞系统,我需要为其复制实体的碰撞器。

我制作了这样的系统,例如我不必一成不变地处理碰撞,(我可能会开始使用 AABB,但可能会更改为 SAT),但无论我使用哪种算法,我都需要对碰撞器进行深度复制将使用。

一方面,深拷贝是一种要求,而复制和交换习语似乎是我应该去的。

另一方面,我collidable不需要是接口以外的任何东西,所以没有理由不做纯粹的虚拟。

因此,我开始写这个:

但我不能复制构造collidable,因为它是纯虚拟的。

请注意,在同一个程序中,我永远不会同时使用多个碰撞算法,因此不会出现方法冲突。

我真的不知道我做错了什么,是设计方面还是技术方面,所以我完全愿意接受建议。

如何强制从可碰撞的类派生来实现 operator= ?

0 投票
3 回答
4098 浏览

c++ - 什么是四规则(半规则)?

为了正确处理对象复制,经验法则是三法则。在 C++11 中,移动语义是一回事,所以它是五法则。但是,在这里和互联网上的讨论中,我还看到了对四规则(半)的引用,它是五规则和复制和交换成语的组合。

那么究竟什么是四法则(半法则)?需要实现哪些功能,每个功能的主体应该是什么样的?哪个功能是一半?与五法则相比,这种方法有什么缺点或警告吗?

这是一个类似于我当前代码的参考实现。如果这是不正确的,正确的实现会是什么样子?

0 投票
1 回答
67 浏览

c++ - 多个构造函数参数的移动语义

对象的构造函数需要来自用户的 twp 参数。要求参数可以是不同的类型,但可以假定每种类型都实现正确的移动语义。(实际示例是一个cubic_spline 类,它是使用数字数据的随机访问对象[向量] 构造的,一个用于“x”,另一个用于“y”或“f(x)”。)

进一步要求用户可以传递任一参数以由对象复制,或者通过移动语义在不复制的情况下捕获。

以下适用于 VC++ std::vector (Dinkumware) 和我编写的自定义容器。真的这么简单吗?我认为下面的代码可能是正确的,但我有偷偷摸摸的怀疑。我的问题很简单,“这是正确的代码吗?” (如果不是,它怎么会失败,应该如何重写?不必要的数据复制将被视为失败。)

0 投票
2 回答
900 浏览

c++ - `std::swap` 应用于这些对象时会做什么?

编码

按预期输出

来自cplusplus.com > std::swap复杂

非数组:常量:只执行一个构造和两个赋值(尽管请注意,这些操作中的每一个都有其自身的复杂性)。

数组: N 中的线性:对每个元素执行交换操作。

这是否意味着std::swap当应用于a1并且a2仅交换指向数组的指针[1,2,3]并且[11,12,13]不复制任何int或任何其他内容时?

std::swap应用于类的两个对象时究竟做了A什么?

假设std::swap复制数组的所有元素,我是否应该编写一个static A::swap函数,使用vector::swap其时间复杂度是恒定的(来自cplusplus.com > vector::swap)意味着它只交换指针?


[..] 想添加一个注释,std::swap在 C++17 中更改了的语义。因此,提及编译器、它的版本以及您的目标标准可能是一个好主意。

我希望一个看起来很简单的问题不会带来 C++ 标准和编译器版本的复杂性。我通常用 C++11 编译我的代码。为了完整起见,这里是我笔记本电脑上的 gcc 版本。

0 投票
0 回答
106 浏览

c++ - 不推荐复制交换习语?

很长一段时间以来,我认为实现复制分配(对于非平凡类)的正确方法是使用复制交换习语。

但是后来我听到了 Howard Hinnant 的演讲https://www.youtube.com/watch?v=vLinb2fgkHk ,他说复制交换成语可以很好地实现强例外保证,但总的来说这是一种矫枉过正。

他在这里提到:https ://youtu.be/vLinb2fgkHk?t=2616

strong_assing(A& target, A const& source)所以他建议明确地实现复制分配,并有一个包含复制交换的单独函数。

我不明白的是A& operator=(A const& other)应该如何实施呢?

他建议有这样的东西吗?

这是什么std::vector实现呢?也就是说,他们最后不使用复制交换习语吗?标准向量不需要强异常保证吗?