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

c++ - 移动构造函数和静态数组

我一直在探索 C++ 中移动构造函数的可能性,我想知道在下面的示例中利用此功能的一些方法是什么。考虑这段代码:

在上面的示例中,如果我们跟踪程序(使用 MSVC++ 2011),我们会看到Foo<N>::Foo(Foo<N>&&)在构造时调用了foo,这是所需的行为。但是,如果我们没有Foo<N>::Foo(Foo<N>&&),Foo<N>::Foo(const Foo<N>&)则会被调用,这将执行冗余复制操作。

我的问题是,如代码中所述,对于这个使用静态分配的简单数组的特定示例,有没有办法利用移动构造函数来避免这种冗余副本?

0 投票
1 回答
3484 浏览

c++ - 具有成员 std::vector 的移动语义

抱歉,如果之前有人问过这个问题,但据我了解,在 C++11 中,std::vector有一个移动构造函数,因此在某些情况下,副本几乎不会花费任何成本,比如按值返回一个。但是,如果我有一个像这样的类,将 avector作为成员变量:

并有一个按值返回其中之一的函数,例如

即使它本身对移动构造函数一无所知,mc.myvec是否会调用移动构造函数并利用移动构造函数?还是会调用 的复制构造函数,而所有成千上万(甚至可能是数百万)的s 都必须一个一个复制?std::vectorMyClassvectorint

0 投票
2 回答
11514 浏览

c++ - 移动构造函数是自动生成的吗?

我有一个很大的班级,里面有很多 STL 容器。
编译器会自动创建一个移动构造函数,将这些容器移动到目标,还是我必须自己制作?

0 投票
2 回答
258 浏览

c++ - 为什么当一个成员不能移动时,整个封闭类不能移动?

例子

假设复制构造函数除了有用之外还做了一些事情。然后

vo首先复制到初始 lambda 对象中,这很好。但是每次需要移动 lambda 对象时,它们都会再次被复制。虽然v 可以移动,但不是。这是因为 lambda 没有隐式移动构造函数,因为o没有移动构造函数或普通复制构造函数。

有人可以解释这背后的理由吗?

0 投票
1 回答
16859 浏览

c++ - 如何调用移动构造函数?

在下面显示的代码中,如何将右值分配给函数 main 中的对象 A?

谢谢。

0 投票
3 回答
2736 浏览

c++ - 为什么显式调用基本移动构造函数实际上调用基本复制构造函数?

我正在尝试通过派生类 move ctor 显式调用基类 move ctor,但是,令人惊讶!,这实际上调用了基类复制ctor而不是基类移动ctor。

我在std::move()对象上使用函数来确保正在调用派生的移动 ctor!

编码:

节目输出:

基础复制因子

派生移动子

如您所见,基类 move ctor 被遗忘了,那么我该如何称呼它呢?

0 投票
2 回答
2527 浏览

c++ - 为什么这段代码试图调用复制构造函数?

我只是在 Visual Studio 中花费了大量时间来处理编译错误。我已将代码提炼成下面的可编译的小示例,并在 IdeOne 上进行了尝试,并得到了您可以在此处看到的相同错误。

我想知道为什么以下代码尝试调用B(const B&)而不是B(B&&)

我没有明确定义任何构造函数,所以B(std::move(binst))应该调用编译器生成B(B&&),不是吗?

当我更改B

它编译得很好。为什么是这样?

如果这不能从基类中修复,那将非常不方便,因为我有一个模板类,它使用像示例这样的放置 new 和移动构造函数,并且它将需要每个不可复制的类(这不是而且绝对应该不是与我的模板类一起使用的要求)具有明确定义的移动构造函数。

0 投票
2 回答
307 浏览

c++ - 移动所有者时,对所有者的 C++ 复合引用已损坏

我整天都在做这件事,所以我希望我不会忘记任何重要的细节,但是就这样吧。我最初的目标是拥有一个封装了如何创建播放器的逻辑的播放器工厂。

看起来是这样的:

在播放器中,有一个复合的 PlayerInputComponent 成员变量。这个 PlayerInputComponent 对象封装了处理玩家输入的逻辑,为此它需要一个指向实际玩家本身的引用/指针。很简单,它将对播放器的引用作为其构造函数的唯一参数。

当玩家对象被构造时,它的初始化列表将一个对自身的引用传递给 PlayerInputComponent 对象。这是它的外观:

我知道在初始化列表中取消引用它通常是一个坏主意,但我只是使用它在 PlayerInputComponent 对象中设置引用。这是构造函数:

无论出于何种原因,当播放器工厂返回它创建的播放器的本地副本时,引用就会出现乱码。我的意图是让在堆栈上创建的播放器实例被移动并分配给被调用者。如下所示:

在代码执行播放器的复合 PlayerInputComponent 对象后,对其播放器的引用被破坏。我知道当工厂将本地播放器对象返回给被调用者时会调用播放器的移动构造函数,但是播放器在 PlayerInputComponent 中的引用会发生什么?有没有更好的方法来解决这个问题?我喜欢在这种情况下使用引用与指针的语义含义,尽管我确实尝试使用指针并得到相同的结果。

当播放器对象移出 CreatePlayer() 成员函数并分配给“自动播放器”时,谁能向我解释 PlayerInputComponent 对播放器的引用发生了什么?

为了完整起见,这里是对象的声明:

这是播放器:

我在下面重建了一个小例子,它显示了确切的行为,它编译/演示了问题。谢谢!

0 投票
2 回答
29810 浏览

c++ - 如何让 g++ 使用移动构造函数编译 c++11 代码?

我似乎无法让 g++ 编译使用移动构造函数的 c++11 代码。我不断收到此错误:

我正在编写的程序与此完全不同,但我将其修剪到看起来应该可以正常工作的部分,但仍然会触发错误:

谁能告诉我我做错了什么?而是如何解决?

这是我的 gcc 版本:

0 投票
1 回答
380 浏览

c++ - 析构函数隐藏在这段代码中的什么地方?

我无法理解为什么Foo移动构造函数试图~ptr在以下示例中调用:

海湾合作委员会 4.7:

Clang 3.1-pre:

这是怎么回事?我正在编写移动构造函数以避免运行复制 ctors 和 dtors。请注意,这是一个试图隐藏其实现的头文件(pimpl idiom),因此FooDeleter不能选择完整类型。

编辑:在博的回答之后,我在noexcept所有可以添加的地方添加(在上面编辑)。但错误仍然相同。