问题标签 [move-constructor]

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 投票
3 回答
289 浏览

c++ - 为什么移动 ctor 不要求从临时对象构造(操作符 + 的结果)?

现在已经回答了:不要费心阅读这个问题,它有点冗长,可能不值得你花时间。我的代码中存在错误,这就是未调用移动构造函数的原因。检查答案以获取详细信息。请记住,RVO 和 NRVO(命名返回值优化)可能会导致调用未按预期发生。


我希望为这一行调用 move ctor,但调用的是 copy ctor:

Ding 类有一个用户定义的 move ctor 和 operator+ 重载。我希望调用移动 ctor 的原因是 operator+ 返回一个临时对象,一个右值引用,因此可能会发生移动优化。

我在这里写的所有内容都可能是错误的,因为我是 C++ 初学者。这是代码:

VC2010 Express 和 MinGW (GCC 4.6) 的编译器调用(在 Win7 上)如下:

两个二进制文件产生相同的输出(程序结束时没有破坏顺序):

回想一下这个长文本之后的问题:为什么不调用移动构造函数Ding d3 = d1 + d2;

我知道还有其他关于为什么没有调用移动 ctor 的问题,但我无法将他们的答案映射到这个案例。

更新

根据 David Rodriguez 的评论,我将程序更改如下:

然后,我使用上面提到的编译器调用重新编译了程序,并得到了一个输出,其中copy for: jajajanein删除了一个副本 ( )。然后我尝试了以下行:

还有塔塔!现在我看到了移动 ctor 在工作!...但是我认为现在还有另一个错误,该 new 的输出move-gcc.exe不再列出 dtor 调用:

第二次更新

我用operator+以下(可能同样糟糕)代码替换了坏的:

我还从析构函数中删除了以下行,它阻止了程序异常终止:

使用 MSVC 和g++ -std=c++0x -fno-elide-constructors.

0 投票
3 回答
2133 浏览

c++ - 移动构造函数和多重继承

概要

当类使用多重继承时,如何安全地设计移动构造函数?

细节

考虑以下场景:

有没有办法既安全TU安全地移动建造?

0 投票
1 回答
958 浏览

c++ - 为什么调用这个复制构造函数而不是移动构造函数?

以下代码片段导致在我期望调用移动构造函数的位置调用复制构造函数:

在 VS11 Beta 上,在调试模式下,会打印:

我检查了标准,Bar似乎满足了自动生成默认移动构造函数的所有要求,但除非有其他原因导致无法移动对象,否则这似乎不会发生。我在这里看到了很多与移动和复制构造函数相关的问题,但我认为没有人遇到过这个特定问题。

关于这里发生了什么的任何指示?这是标准行为吗?

0 投票
1 回答
1024 浏览

c++ - C ++移动构造函数和常量成员指针或常量成员,如何取消它们以避免内存泄漏?

我有一个类,它有一个常量成员、常量指针和枚举类成员,

我对以下示例代码的问题:

  1. 如何在移动构造函数中正确地取消“其他”的枚举类成员(分配什么值?)
  2. 如何在移动构造函数中使“其他”的常量指针无效,以便其他的析构函数不会删除正在构造的对象的内存,并且指针仍然有效?
  3. 如何在移动构造函数中使“其他”的常量成员无效,以免调用其他的析构函数?

0 投票
4 回答
187 浏览

c++ - 我真的必须取消移动构造函数/移动分配中的所有成员还是只是指针?

我真的很难学习使“其他”对象无效,我刚刚在这里阅读了有关移动语义的整篇大文章,我很失望,因为它不包括无效。

请解释一下,我们真的需要取消“其他”的所有成员还是只是指向动态分配内存的指针?

为什么我们要关心使不在堆上的(其他对象的)成员无效?有什么好的理由吗?

0 投票
1 回答
58 浏览

emulation - 在 C++03 auto_ptr 为什么不调用编译器生成的 copy-ctor?

我了解auto_ptrC++03 中的工作原理。它基于这个技巧。当编写这样的代码时,该技巧使用用户定义的转换将指针从一个对象窃取到另一个对象auto_int p(auto_int(new int()));。但是,我在这方面有几个问题。

  1. 为什么不调用编译器生成的 copy-ctor?
  2. 为什么用户定义的转换优先于编译器生成的复制ctor?
  3. 是否有编译器生成的 copy-ctor 开头?
  4. 如果不是,什么语言规则禁止它?
0 投票
4 回答
10500 浏览

c++ - 移动构造函数应该采用 const 还是非 const 右值引用?

在几个地方,我看到推荐的复制和移动构造函数签名如下:

复制构造函数采用 const 引用,而移动构造函数采用非 const 右值引用。

但据我所见,这阻止了我在从函数返回 const 对象时利用移动语义,例如以下情况:

使用 VC11 Beta 进行测试,T调用的是复制构造函数,而不是移动构造函数。即使使用return std::move(t);复制构造函数仍然被调用。

我可以看到这是有道理的,因为tconst 所以不应该绑定到T&&. 在移动构造函数签名中使用const T&&效果很好,并且很有意义,但是您会遇到问题,因为other是 const,如果需要将其成员清空,则不能将其清空 - 只有当所有成员都是标量时,它才会起作用或具有正确签名的移动构造函数。

它看起来是确保在一般情况下调用移动构造t函数以首先制作非常量的唯一方法,但我不喜欢这样做 - 构造事物是一种很好的形式,我不希望客户T知道他们必须反对这种形式才能提高性能。

所以,我想我的问题是双重的;首先,移动构造函数应该采用 const 还是非 const 右值引用?第二:我的推理是否正确?我应该停止返回 const 的东西吗?

0 投票
2 回答
6179 浏览

c++ - vector::push_back 坚持使用复制构造函数,尽管提供了移动构造函数

我从 gcc 收到一个奇怪的错误,不知道为什么。我制作了以下示例代码以使问题更加清晰。基本上,定义了一个类,我将其复制构造函数和复制赋值运算符设为私有,以防止意外调用它们。

我希望这段代码能够编译,但是 gcc 失败了。实际上 gcc 抱怨“branch::branch(const branch&) 是私有的”,据我所知不应该被调用。

赋值运算符有效,因为如果我将 main() 的主体替换为

它将按预期编译和运行。

这是 gcc 的正确行为吗?如果是这样,上面的代码有什么问题?任何建议对我都有帮助。谢谢!

0 投票
3 回答
1031 浏览

c++ - 我看到的所有基于 std::move() 的 std::swap() 实现都有问题吗?

可能重复:
我可以对移出的对象做什么?

例如,请参阅此代码

只是我,还是这里有错误?如果你move a进入tmp,那么不就a失效了吗?

即移动分配不应该ab一个带有放置的移动构造函数调用new吗?
如果不是,那么移动构造函数和移动赋值运算符有什么区别?

0 投票
0 回答
446 浏览

c++ - 使用 C++ 2011 移动语义优化代码

可能重复:
有人可以向我解释一下移动语义吗?

考虑以下恒定大小数学数组的示例代码:

它产生输出:

我听说过 C++2011 的“移动语义”和“移动构造函数”,我想知道是否有办法在这段代码中避免一些临时的。这是真的还是假的?

如果可能的话,怎么做(如果有人可以写一个例子,那就太好了,因为我没有清楚地理解我在移动语义上找到的文档)?