问题标签 [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.
c++ - C++按值赋值,有什么缺点?
最近,我偶然发现了这种模式:
仔细观察这个模式会发现,由于复制省略,这个单一的分配功能可以免费提供移动分配和“复制和交换”的复制分配。既然这么好用,又何尝不是“主流模式”呢。有没有这样做的?
注意:没有临时对象的自定义复制构造函数可以在更少的步骤中产生操作,但是,对于这个问题,明确编写复制和移动分配周围的交换可以带来什么好处。
关于可能重复的问题“什么是复制和交换习语”,我的问题假设读者已经知道它是什么。
谢谢
c++ - 我应该在复制赋值运算符中使用placement-new
我正在创建一个受歧视的类工会。我正在使用 c++ 17,所以我可以在技术上使用 a std::variant
,但是由于特定的用例,我希望每个变体的含义更加明确(特别是因为其中两个案例除了它们是哪种情况外没有数据)。该类看起来像这样(为了简单起见,我将忽略问题中的移动语义):
我对复制赋值运算符的第一个想法是
这对我来说似乎很好,但我想知道调用字符串的复制赋值运算符是否更好的 C++ 风格,这需要更像这样的东西:
总而言之,这样做的正确方法是什么(以及为什么),或者这很重要?
* 这行是因为我的原始实现aVal
直接设置而没有确保那里曾经初始化过一个字符串,并且它崩溃了。
c++ - 在 C++ 中复制赋值构造函数
尝试创建复制赋值构造函数时出现此错误:“重载运算符必须是二元运算符”
这是我的代码:标题:
cp:
错误在 cpp 文件中。任何人?
c++ - 实现复制赋值运算符的正确方法
我试图了解实现复制赋值运算符的正确方法=
。所以我实现了这个例子:
到目前为止,我已经展示了不正确的=
运算符形式。
是不是错了,因为:
所以我不知道这里的评估顺序是如何发生的:
psName = new std::string(*rhs.psName);
. 那么这是一个UB吗?还有呢:
/li>
但是会产生相同的结果,即未定义的值。
- 我谈论将一些对象分配给自身。
** 人们也争论:delete psName; psName = new std::string();
他们说new
可能会扔。但我认为只要我发布了与它相同的资源,它就不应该。
** 注意:事实上,我不是关于std::string
获取任何资源,而是关于获取任何资源。
c++ - 将 shared_ptr 分配给自身安全吗?
自行分配 a 是否安全std::shared_ptr
?所以这里有一个例子:
我知道分配一个shared_ptr
对象:
- 将减少左侧(LHS)操作数引用计数(RC),然后检查它是否为0(这些先前的操作是原子完成的),如果是则释放资源;
- 此外,将增加右侧(RHS)RC。
所以在这个例子中,对象在 LHS 和 RHS 上都是相同的,并且赋值运算符中这两个 RC 变化的顺序是未指定的。
我真的不知道在自我分配的情况下会发生什么。
c++ - 复制赋值运算符说明
我为我创建的一个类编写了一个复制赋值运算符,我使用以前的帖子作为指导: 什么是三法则?
我对这个人解释的一个方面有点困惑。
这是他们的课程:
这是我用作参考的复制赋值运算符定义(至少提供了 2 个):
我发现令人困惑的是,为什么它们包括这条线delete[] name;
?
这是他们提供的另一个示例:
我立即回避了这个,因为我不明白为什么该函数会检查if(this != &that)
然后在似乎尚未生成的数组上运行 delete (delete[] name;)。调用赋值运算符时,是否在调用复制赋值运算符函数之前立即调用常规构造函数?因此意味着我们必须删除由类构造函数生成的数组,因为它只能充满垃圾数据?
为什么我不能只写:
name = that.name
或
这可能是非常基本的,我应该只实现帖子的建议,但我的实际用例涉及具有多个成员的 s 数组,struct
所以我只是有点难以理解我到底需要做什么。
我意识到这里有 2.5 个问题。任何见解将不胜感激。
这是我第一次实现自定义复制构造函数和复制赋值运算符,我相信在我完成几次之后它会看起来很容易。
提前致谢。
c++ - 默认构造函数表达式和左值
我和我的 C++ 同事遇到了一个奇怪的结构:
该A() = A{2}
表达式完全让我们感到困惑,因为它似乎正在分配A{2}
给一个临时的、默认构造的对象。但是在编译器资源管理器(https://gcc.godbolt.org/z/2LsfSk)中看到它。它似乎是一个法律声明(由 GCC 9 和 Clang 9 支持),如下声明:
因此,在某些情况下,它似乎A()
是一个左值。还是这里发生了其他事情?希望得到一些解释,最好是对 C++17 标准的引用。
更新:@Brian 发现这是分配给右值的副本:为什么会编译?. 但如果有人能在 C++ 标准中找到适当的参考,我将不胜感激。
matlab - 如何在 MATLAB 中显式地制作数组的深层副本?
例如,我想做一个深拷贝a
to b
:
所以这里=
只创建一个浅拷贝。我的问题是,在这种情况下如何生成深层副本?我知道我可以添加一个命令
使其成为深层副本。但是有没有更好的方法来做到这一点?
c++ - 模板之外的复制赋值运算符
我有一堂课
第二个不要求以下
如何让编译器为上述代码调用第二个?
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/的链接。
接受和链接的页面都表明复制赋值运算符的常用实现是(从上一个链接复制和粘贴)
但那
由于编译器的复制省略优化,更好,或者通常,总是按值传递而不是通过引用传递,然后复制通过引用传递的参数。
我同意第二个选项与第一个选项相同或更好,但并不差,但我很困惑为什么第一个选项一开始就是这样写的。我不明白为什么需要临时变量和交换。
相反,我们不能只做类似的事情:
它不使用复制构造函数。