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

c++ - C++0x 移动构造函数陷阱

编辑:我在这里重新问了同样的问题(在解决了这个问题指出的问题之后):为什么这个 C++0x 程序会产生意外的输出?

基本思想是,如果你不小心,指向可移动的东西可能会给你带来一些奇怪的结果。


C++ 移动构造函数和移动赋值运算符看起来非常积极。并且它们可以在复制构造函数没有意义的情况下使用,因为它们不需要复制被指向的资源。

但有些情况下,如果你不小心,它们会咬你。这一点尤其重要,因为我已经看到允许编译器生成移动构造函数的默认实现的建议。如果有人可以给我一个,我会提供一个链接。

所以,这里有一些代码有一些可能并不完全明显的缺陷。我测试了代码以确保它在带有-std=gnuc++0x标志的 g++ 中编译。这些缺陷是什么,你将如何修复它们?

0 投票
4 回答
554 浏览

c++ - 为什么这个 C++0x 程序会产生意外的输出?

这个程序:

test_header.hpp

test_body.cpp

我得到这个输出:

我有点困惑。当我添加一个记录器时,似乎所有旧传感器都被遗忘了。

0 投票
1 回答
1422 浏览

c++ - 移动构造函数和赋值运算符:为什么派生类没有默认值?

为什么没有为派生类创建默认的移动构造函数或赋值运算符?证明我的意思;有这个设置代码:

以下任一行抛出:

但以下都不是:

万一这很重要,我用 GCC 4.4 进行了测试。

编辑:稍后使用 GCC 4.5 进行的测试显示了相同的行为。

0 投票
3 回答
254 浏览

c++ - 如果可能,移动插入的容器元素

我正在尝试在我的容器库中实现以下优化:

  • 插入左值引用元素时,将其复制到内部存储;
  • 但是在插入右值引用元素时,如果支持,请移动它。

优化应该是有用的,例如,如果包含的元素类型是类似std::vector的,如果可能的话移动会大大加快速度。

但是,到目前为止,我无法为此设计任何工作方案。我的容器相当复杂,所以我不能insert()多次重复代码:它很大。我想将所有“真实”代码保留在某个内部助手中,比如说do_insert()(可能是模板化的),并且各种insert()类似的函数只会用不同的参数调用它。

我最好的赌注代码(原型,当然,没有做任何真实的事情):

但是,这至少不适用于 GCC 4.4 和 4.5:它永远不会在 stderr 上打印“移动”。或者是我想要的不可能实现,这就是为什么emplace()首先存在类似功能的原因?

0 投票
6 回答
1522 浏览

c++ - 移动构造函数/操作符=

我正在尝试了解 C++ 的新功能,即移动构造函数和赋值X::operator=(X&&),我发现了有趣的示例 ,但唯一我什至不理解但更不同意的是移动 ctor 和赋值运算符中的一行(在下面的代码中标记):

所以我的问题是:我必须将 lenght_ 的值设置为零还是可以保持不变?不会有任何内存泄漏,也不会少一个表情。

0 投票
3 回答
568 浏览

c++ - 移动ctor和移动dtor

正如我在Move constructor/operator=中所问的那样,过了一段时间我已经同意并接受了这个问题的正确答案,我只是在想,如果有类似“移动析构函数”之类的东西会在移动时被调用是否有用每次我们使用 move ctor 或 operator= 时的对象。
通过这种方式,我们只需要在 move dtor 中指定我们想要的内容,以及我们的对象在被移动构造函数使用后如何被取消。如果没有这种语义,看起来每次我写 move ctor 或 operator= 我都必须在它们中明确说明(代码重复/错误介绍)如何使移动的对象无效,这不是我认为的最佳选择。期待您对这个问题的意见。

0 投票
1 回答
598 浏览

c++ - 只提供一个移动构造函数是不好的形式吗?

我想Foo从函数返回一个不可复制的类型对象。这基本上是一个辅助对象,调用者将使用它来执行一组操作,并使用析构函数在操作完成后执行一些清理。

rvalue references出现之前,我会返回 ashared_ptr<Foo>或类似的东西。使用右值引用,另一种选择是将构造函数和复制构造函数设为私有,并且唯一的公共构造函数是移动构造函数。Foo看起来像这样:

我的问题是这样做是否会是不好的形式,或者看起来是否合理。我想不出这会导致问题或难以阅读的任何原因,但是当涉及到右值引用时,我仍然是一个新手,所以可能有一些我没有想到的考虑因素。

0 投票
1 回答
691 浏览

rvalue-reference - 在隐式转换中移动构造函数(右值引用)

我正在将 C++ 项目从 MSVC 2008 升级到 2010,并且由于新的 CComBSTR 移动构造函数 [CComBSTR( CComBSTR&& )],由于调用不明确,我收到编译器错误。

本质上,我们有一个 String 类,它与具有 CComBSTR 的强制转换运算符的 std::wstring 非常相似。这类似于以下代码:

现在,在代码中的某些地方,我们执行以下操作:

在 VS2008 中,这会起作用,因为 CString 对象将被隐式转换为 CComBSTR 右值,并且将调用 CComBSTR 的复制构造函数(采用 const CComBSTR&)来构造 objectName。

然而,在带有 C++0x 的 VS2010 中,编译器给出了一个模棱两可的调用错误,因为 CComBSTR 右值似乎同时适合复制构造函数和移动构造函数。

虽然有点笨拙,但我对这个问题的解决方案是 static_cast 对 GetName 的调用:

这两行编译都没有错误,但我需要您就这是否非法、不好的做法或未定义提出建议。谢谢你。

0 投票
3 回答
1309 浏览

c++ - 使用 move 作为线程向量的自定义分配器

我目前正在学习 C++ 中的并发性,并且遇到了使用线程向量的情况,我相信这在 C++0x 中是可能的。但是,我当前的编译器似乎没有移动感知容器的实现,因此我会因为std::thread::thread(const std::thread&)被删除而生成错误,即我只能将移动构造函数/移动赋值与std::thread.

我是否正确地认为我可以通过使用编写自定义分配器来规避这个问题

而不是

? 或者这个主题的一些其他变体(可能使用 MyAllocator::construct 的重载)。

注意:这主要是为了作为一个短期的教育练习和足够好的执行工作来玩转容器中的线程。我只会MyAllocator在这种情况下使用。但是,也请向我指出任何可能已实现此功能的库,以便我可以在源代码上进行戳戳。

0 投票
2 回答
15311 浏览

c++ - 将移动语义与 std::pair 或 std::tuple 一起使用

假设您想利用移动语义,但您的一个可移动类需要是std::pair. 目的是创建一个函数,该函数返回一个std::pair可以被视为右值并转发的函数。

但是我看不到如何做到这一点,除非对其std::pair自身进行内部更改,以使其了解移动语义。

考虑以下代码:

问题是std::make_pair,以及std::pair构造函数本身,需要两个对象并尝试制作它们的内部副本。这会导致它尝试调用复制构造函数。但在我的示例中,我希望能够将新对移动到res,并确保不制作任何副本。我认为这是不可能的,除非std::pair它本身在内部定义了以下构造函数:

但它没有,至少在我使用的编译器(gcc 4.3.2)上没有。可能是我的编译器只是过时了,而实际上较新的版本具有此移动感知构造函数。但是目前我对移动语义的理解有些不稳定,所以我不确定我是否只是在这里忽略了一些东西。那么,在没有实际重新实现的情况下,我想要实现的目标是否可行std::pair?还是我的编译器刚刚过时?