问题标签 [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 投票
1 回答
2447 浏览

c++ - 何时重载按引用传递(左值和右值)优于按值传递?

我已经看到它说,operator=在 C++11 中,按值获取相同类型的参数既可用作复制赋值运算符,又可用作移动赋值运算符:

替代方案将是代码重复次数的两倍以上,并且可能出现错误:

在什么情况下 ref-to-const 和 r-value 重载比按值传递更可取,或者什么时候有必要?我正在考虑std::vector::push_back,例如,它被定义为两个重载:

在第一个示例中,按值传递用作复制赋值运算符和移动赋值运算符,不能push_back在标准中定义为单个函数吗?

0 投票
2 回答
1437 浏览

c++ - 如何在具有复制和交换习语的赋值运算符中使用 noexcept?

移动赋值运算符通常应声明为 noexcept(即,将类型存储在 STL 容器中)。但是复制和交换习惯用法允许在单个代码中定义复制和移动赋值运算符。在这种情况下如何处理 noexcept 说明符?复制构造可以抛出,但我怀疑它是否会违反 noexcept 说明符。

0 投票
2 回答
1589 浏览

c++ - why should the parameter of assignment operator be passed by reference in C++?

i read the C++ primer 5th. i saw that it is ok when we use non-reference parameters in assignment operators that use copy and swap,but in the other assignment operators we always use reference parameters and copy the right-hand operand before destroying left-hand operand to make sure the assignment operators work correctly if an object is assigned to itself. why not use non-reference parameter in the assignment operators that will copy in the function body later so that we need not copy the right-hand operand in the function body?

0 投票
3 回答
5381 浏览

c++ - 移动分配与标准复制和交换不兼容

测试新的移动语义。

我刚刚询问了我在使用 Move Constructor 时遇到的问题。但正如评论中发现的那样,当您使用标准的“复制和交换”习语时,问题实际上是“移动赋值”运算符和“标准赋值”运算符发生冲突。

这是我正在使用的课程:

我认为相当沼泽标准。

然后我像这样测试我的代码:

这里的赋值a应该使用“移动赋值”运算符。但是与“标准分配”运算符(它被写为您的标准副本和交换)存在冲突。

现在我可以通过将“标准分配”运算符修改为:

但这并不好,因为它会干扰编译器优化复制和交换的能力。请参阅什么是复制和交换习语?这里这里

我错过了一些不那么明显的东西吗?

0 投票
4 回答
274 浏览

c++ - 为 =overloading 使用 Copy 构造函数

我有一个有两个向量的类: anint和 an Str。现在我想定义一个复制构造函数,以便颠倒元素的顺序;例如,如果a=(1,Hello),(2,World)我写auto b=a;我得到b=(2,world),(1,hello)。这是完美的工作。我遇到的问题是重载=运算符,以便使用复制构造函数。这是我的类加上复制构造函数:

当我重载=运算符时,会调用构造函数,问题是没有将 valur 传递给 LHS 变量。这里是重载的=

我的主要功能是:

为什么c1一直空白??

0 投票
1 回答
1071 浏览

php - 如何在php中交换多维数组中的元素

我正在使用 php 处理数组,我正在尝试交换数组的项目。我有这个代码:

上面的代码有一个输出:

我正在尝试交换数组的索引,因此输出将如下所示:

谢谢你们的帮助。

0 投票
4 回答
1135 浏览

c++ - 使用纯虚拟类复制和交换习语

我正在尝试使用纯虚拟方法和“复制和交换”习语来实现虚拟类,但遇到了一些问题。代码无法编译,因为我在包含纯虚方法的类 A 的赋值运算符中创建实例。

有没有办法如何使用纯虚拟方法和复制和交换成语?

错误信息:

0 投票
3 回答
6101 浏览

c++ - Copy-and-Swap 成语是否应该成为 C++11 中的 Copy-and-Move 成语?

this answer中所述,复制和交换习语的实现方式如下:

通过将 MyClass 的值作为 operator= 的参数,该参数可以由复制构造函数或移动构造函数构造。然后,您可以安全地从参数中提取数据。这可以防止代码重复并有助于异常安全。

答案提到您可以交换或移动临时变量。它主要讨论交换。但是,如果没有经过编译器优化,交换会涉及三个移动操作,并且在更复杂的情况下会做额外的额外工作。当您想要的只是临时对象移动到分配对象中。

考虑这个更复杂的例子,涉及观察者模式。在此示例中,我手动编写了赋值运算符代码。重点是移动构造函数、赋值运算符和交换方法:

显然,这个手动编写的赋值运算符中的重复部分代码与移动构造函数的代码相同。您可以在赋值运算符中执行交换并且行为是正确的,但它可能会执行更多移动并执行额外的注册(在交换中)和取消注册(在析构函数中)。

重用移动构造函数的代码不是更有意义吗?

在我看来,这种方法绝不逊色于交换方法。我是否认为复制和交换习语会更好地作为 C++11 中的复制和移动习语,还是我错过了一些重要的事情?

0 投票
1 回答
205 浏览

exception - 复制和交换是否仍然在 C++11 中提供强大的异常保证?

据说复制和交换习语提供了强大的异常保证。但在 C++11 中,std::swap 使用移动操作。

考虑以下代码:

如果throwingObject在交换期间抛出,则强异常保证被打破。

关键字在noexcept编译期间不强制执行任何操作。throwingObject还是可以扔的,唯一的区别就是程序会猛烈terminate。我不认为在发生异常时使整个应用程序崩溃算作强大的异常保证。

这是否意味着复制和交换不再强制执行 C++11 中的强异常保证?


类似问题

这个问题类似,但它的目标是使用标准库。我对这个问题对于复制和交换习语的强例外保证意味着什么很感兴趣。

这个问题讨论了如何noexcept在copy-and-swap成语中使用,但只讨论了copy。不是交换,这似乎是问题所在。

0 投票
4 回答
150 浏览

c++ - 移动语义如何改进“我的方式”?

背景

我今天早些时候阅读了以下答案,感觉就像是在重新学习 C++。

什么是移动语义?

什么是复制和交换成语?

然后我想知道我是否应该改变我的“方式”来使用这些令人兴奋的功能;我主要关心的是代码效率和清晰度(前者对我来说比后者更重要)。这导致我这篇文章:

为什么要有移动语义?

我强烈不同意(我同意答案,即);我不认为巧妙地使用指针会使移动语义变得多余,无论是在效率还是清晰度方面。

问题

目前,每当我实现一个重要的对象时,我大致这样做:

根据我从今天阅读的前两篇文章中了解到的情况,我想知道改成这个是否有益:

现在,除了稍微复杂和冗长之外,我看不到第二个 ( struct X) 会产生性能改进的情况,而且我发现它的可读性也较差。假设我的第二个代码正确使用了移动语义,它将如何改进我当前的做事“方式”struct Y)?


注1:我认为使后者更清楚的唯一情况是“退出功能”

我认为替代方法使用std::shared_ptrstd::reference_wrapper如果我厌倦了get()

只是稍微不太清楚,但同样有效。

注2:我确实努力使这个问题准确和可回答,并且不受讨论;仔细考虑,不要将其解释为“为什么移动语义有用”,这不是我要问的。