问题标签 [copy-assignment]

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 回答
62 浏览

c++ - C++按值赋值,有什么缺点?

最近,我偶然发现了这种模式:

仔细观察这个模式会发现,由于复制省略,这个单一的分配功能可以免费提供移动分配和“复制和交换”的复制分配。既然这么好用,又何尝不是“主流模式”呢。有没有这样做的?

注意:没有临时对象的自定义复制构造函数可以在更少的步骤中产生操作,但是,对于这个问题,明确编写复制和移动分配周围的交换可以带来什么好处。

关于可能重复的问题“什么是复制和交换习语”,我的问题假设读者已经知道它是什么。

谢谢

0 投票
1 回答
210 浏览

c++ - 我应该在复制赋值运算符中使用placement-new

我正在创建一个受歧视的类工会。我正在使用 c++ 17,所以我可以在技术上使用 a std::variant,但是由于特定的用例,我希望每个变体的含义更加明确(特别是因为其中两个案例除了它们是哪种情况外没有数据)。该类看起来像这样(为了简单起见,我将忽略问题中的移动语义):

我对复制赋值运算符的第一个想法是

这对我来说似乎很好,但我想知道调用字符串的复制赋值运算符是否更好的 C++ 风格,这需要更像这样的东西:

总而言之,这样做的正确方法是什么(以及为什么),或者这很重要?


* 这行是因为我的原始实现aVal直接设置而没有确保那里曾经初始化过一个字符串,并且它崩溃了。

0 投票
0 回答
59 浏览

c++ - 在 C++ 中复制赋值构造函数

尝试创建复制赋值构造函数时出现此错误:“重载运算符必须是二元运算符”

这是我的代码:标题:

cp:

错误在 cpp 文件中。任何人?

0 投票
0 回答
36 浏览

c++ - 实现复制赋值运算符的正确方法

我试图了解实现复制赋值运算符的正确方法=。所以我实现了这个例子:

到目前为止,我已经展示了不正确的=运算符形式。

是不是错了,因为:

  • 所以我不知道这里的评估顺序是如何发生的:psName = new std::string(*rhs.psName);. 那么这是一个UB吗?

  • 还有呢:

    /li>

但是会产生相同的结果,即未定义的值。

  • 我谈论将一些对象分配给自身。

** 人们也争论:delete psName; psName = new std::string();他们说new可能会扔。但我认为只要我发布了与它相同的资源,它就不应该。

** 注意:事实上,我不是关于std::string获取任何资源,而是关于获取任何资源。

0 投票
2 回答
382 浏览

c++ - 将 shared_ptr 分配给自身安全吗?

自行分配 a 是否安全std::shared_ptr?所以这里有一个例子:

我知道分配一个shared_ptr对象:

  • 将减少左侧(LHS)操作数引用计数(RC),然后检查它是否为0(这些先前的操作是原子完成的),如果是则释放资源;
  • 此外,将增加右侧(RHS)RC。

所以在这个例子中,对象在 LHS 和 RHS 上都是相同的,并且赋值运算符中这两个 RC 变化的顺序是未指定的。

我真的不知道在自我分配的情况下会发生什么。

0 投票
3 回答
265 浏览

c++ - 复制赋值运算符说明

我为我创建的一个类编写了一个复制赋值运算符,我使用以前的帖子作为指导: 什么是三法则?

我对这个人解释的一个方面有点困惑。

这是他们的课程:

这是我用作参考的复制赋值运算符定义(至少提供了 2 个):

我发现令人困惑的是,为什么它们包括这条线delete[] name;

这是他们提供的另一个示例:

我立即回避了这个,因为我不明白为什么该函数会检查if(this != &that)然后在似乎尚未生成的数组上运行 delete (delete[] name;)。调用赋值运算符时,是否在调用复制赋值运算符函数之前立即调用常规构造函数?因此意味着我们必须删除由类构造函数生成的数组,因为它只能充满垃圾数据?

为什么我不能只写: name = that.name

这可能是非常基本的,我应该只实现帖子的建议,但我的实际用例涉及具有多个成员的 s 数组,struct所以我只是有点难以理解我到底需要做什么。

我意识到这里有 2.5 个问题。任何见解将不胜感激。

这是我第一次实现自定义复制构造函数和复制赋值运算符,我相信在我完成几次之后它会看起来很容易。

提前致谢。

0 投票
1 回答
213 浏览

c++ - 默认构造函数表达式和左值

我和我的 C++ 同事遇到了一个奇怪的结构:

A() = A{2}表达式完全让我们感到困惑,因为它似乎正在分配A{2}给一个临时的、默认构造的对象。但是在编译器资源管理器(https://gcc.godbolt.org/z/2LsfSk)中看到它。它似乎是一个法律声明(由 GCC 9 和 Clang 9 支持),如下声明:

因此,在某些情况下,它似乎A()是一个左值。还是这里发生了其他事情?希望得到一些解释,最好是对 C++17 标准的引用。


更新:@Brian 发现这是分配给右值的副本:为什么会编译?. 但如果有人能在 C++ 标准中找到适当的参考,我将不胜感激。

0 投票
2 回答
1844 浏览

matlab - 如何在 MATLAB 中显式地制作数组的深层副本?

例如,我想做一个深拷贝ato b

所以这里=只创建一个浅拷贝。我的问题是,在这种情况下如何生成深层副本?我知道我可以添加一个命令

使其成为深层副本。但是有没有更好的方法来做到这一点?

0 投票
0 回答
33 浏览

c++ - 模板之外的复制赋值运算符

我有一堂课

第二个不要求以下

如何让编译器为上述代码调用第二个?

0 投票
1 回答
105 浏览

c++ - 在复制赋值运算符中按值传递与按引用传递

首先,有一个类似的热门帖子What is the copy-and-swap idiom?. 接受的答案具有指向https://web.archive.org/web/20140113221447/http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/的链接。

接受和链接的页面都表明复制赋值运算符的常用实现是(从上一个链接复制和粘贴)

但那

由于编译器的复制省略优化,更好,或者通常,总是按值传递而不是通过引用传递,然后复制通过引用传递的参数。

我同意第二个选项与第一个选项相同或更好,但并不差,但我很困惑为什么第一个选项一开始就是这样写的。我不明白为什么需要临时变量和交换。

相反,我们不能只做类似的事情:

它不使用复制构造函数。