问题标签 [move-semantics]

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

c++ - 当向量增长时如何强制执行移动语义?

我有std::vector一个特定类的对象A。该类是非平凡的,并且定义了复制构造函数移动构造函数。

如果我用对象填充向量A(使用 eg myvec.push_back(a)),向量的大小会增加,使用复制构造函数A( const A&)来实例化向量中元素的新副本。

我可以以某种方式强制A使用类的移动构造函数吗?

0 投票
8 回答
22696 浏览

c++ - initializer_list 和移动语义

我可以将元素移出 astd::initializer_list<T>吗?

由于std::intializer_list<T>需要特别的编译器注意并且没有像 C++ 标准库的普通容器那样的值语义,我宁愿安全也不愿道歉和问。

0 投票
1 回答
1282 浏览

c++ - unique_ptr C++03 仿真中的 move 函数

我试图了解如何实现unique_ptr 的 C++03 仿真。unique_ptr 很像 std::auto_ptr 但更安全。在 auto_ptr 隐式转移所有权(即,静默)的情况下,它会吐出编译器错误。例如,一个简单的分配。功能move是模拟 unique_ptr 安全性的关键。

问题:

  1. 为什么有三个移动功能?
  2. 第三个移动函数接受引用并将其转换为右值,实现(简化)如下。

    /li>

在上面的代码中,对 T 的显式转换似乎是不必要的。事实上,Visual Studio 2010 在没有显式转换为 T 的情况下非常满意。

但是,g++、clang、Comeau 不喜欢第二个版本。这些编译器抱怨没有构造函数unique_ptr<T>作为detail_unique_ptr::rv<T>参数。这是为什么?detail_unique_ptr::rv<T>unique_ptr 已经定义了一个作为参数的(非显式)构造函数。为什么不自动捡起那个?

0 投票
5 回答
19656 浏览

c++ - 我可以列出初始化只移动类型的向量吗?

如果我通过我的 GCC 4.7 快照传递以下代码,它会尝试将unique_ptrs 复制到向量中。

显然这行不通,因为std::unique_ptr不可复制:

错误:使用已删除的函数 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete; std::unique_ptr<_Tp, _Dp> = std::unique_ptr]'

GCC 尝试从初始化列表中复制指针是否正确?

0 投票
3 回答
894 浏览

c++ - std :: move 的类型是什么?

此代码按预期工作(在此处在线)。最后v是空的,w不是空的,因为它已经窃取了v.

但是如果我替换auto vp=move(v)

然后就不动了。相反,它复制并且两个向量最后都不为空。如图所示

澄清:更具体地说,什么是自动派生类型vp?如果不是vector<int> &&,那还能是什么?为什么这两个例子尽管如此相似却给出了不同的结果?

额外:我也试过这个,它仍然复制而不是移动

0 投票
3 回答
31092 浏览

c++ - 什么是“*this 的右值引用”?

在 clang 的C++11 状态页面中遇到了一个名为“*this 的右值引用”的提议。

我已经阅读了很多关于右值引用并理解它们的内容,但我认为我不知道这一点。使用这些术语,我也无法在网上找到太多资源。

页面上有提案文件的链接:N2439(将移动语义扩展到 *this),但我也没有从那里得到太多示例。

这个功能是关于什么的?

0 投票
4 回答
18524 浏览

c++ - 既然我们已经有了移动语义,那么专门化 std::swap 了吗?

可能重复:
移动语义 == 自定义交换功能已过时?

这是std::swapC++11 中的样子:

当然,如果我的类定义了一个移动构造函数和一个移动赋值运算符,我是否仍然需要专注std::swap于我自己的类型,或者std::swap尽可能高效?

0 投票
1 回答
1330 浏览

c++ - 使用隐式可转换对象调用移动重载函数时出现编译错误

该程序不使用编译clang++ test.cpp -std=c++0x

编译错误:

为什么它不编译?为什么编译器更喜欢A::operator = (A&&)over A::operator = (const A&)

另外,为什么会A a = b;compile while both A a; a = b;(上述程序)而A a(b);do not?

0 投票
1 回答
4924 浏览

c++ - C++ - Boost.Promise、Boost.Unique_Future 和移动语义

我正在关注 Bartosz Milewski 的一些教程,我觉得这些教程非常有用。然而,由于作者使用 C++11 线程标准的just::thread实现(我还没有),我决定现在使用 boost 线程,因为本教程的作者说它对这样做。本系列的前三个教程似乎就是这种情况,但我在第四个教程中遇到了一些问题。这是我的代码:

以下行似乎提出了一个我不明白的问题:

编译器抱怨的地方:

错误 C2248:“boost::promise::promise”:无法访问在“boost::promise”类中声明的私有成员

谁能提出问题可能是什么?

提前致谢!

0 投票
1 回答
269 浏览

c++ - VS2010 绑定实现不支持只移动类型?

我发现以下代码在 Visual Studio 2010 中无法编译(但在 GCC 中运行良好):

我得到的错误是:

'std::unique_ptr<_Ty>::unique_ptr' : 无法访问在类 'std::unique_ptr<_Ty>' 中声明的私有成员

是因为 VS2010 绑定实现不支持仅移动类型吗?