问题标签 [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.
c++ - 如何处理 C++0x STL 中缺少的“emplace_range”?
我有两个容器,假设它们的定义如下:
假设两者都a
被b
填充。我想使用移动语义将整个容器插入a
到 中的特定位置,以便s 移动到. 让我们假设是一个有效的迭代器到. 以下不起作用:b
unique_ptr
b
i
b
是否有另一种 STL 算法可以实现这种“移动插入范围”?我想我需要一种emplace_range
,但 VS2010 的 STL 中没有。我不想编写一个一个一个插入的循环,因为每次插入时都会向上移动向量的全部内容,因此最终会导致令人讨厌的 O(n^2) 。还有其他选择吗?
c++ - D 是否有类似于 C++0x 的移动语义的东西?
std::vector<T>
具有外部资源(如or )的“值类型”的一个问题std::string
是复制它们往往非常昂贵,并且副本是在各种上下文中隐式创建的,因此这往往是性能问题。C++0x 对这个问题的回答是移动语义,它在概念上基于资源盗窃的思想,并在技术上由右值引用提供支持。
D 有什么类似于移动语义或右值引用的东西吗?
c++ - 移动 ctor 困境
为了禁用我的类的复制,我假设声明为私有但未定义operator=(const MyClass&)
,并且MyClass(const MyClass&)
- 我是否还必须禁用该类的移动 ctor?
c++ - push_back vs emplace_back
我对push_back
和之间的区别有点困惑emplace_back
。
由于存在push_back
采用右值引用的重载,我不太明白这样做的目的是emplace_back
什么?
c++11 - std::move 构造后的对象状态
为了移动构造而移动的对象处于只能被破坏的状态是否合法/正确的c ++ 0x?例如:
作为记录,我试图用一个指针成员包装一个 c++ 类 ac 结构,该指针成员总是应该指向一些分配的内存区域。所有的 c 库 API 都依赖于这个假设。但是这个要求阻止了编写一个真正便宜的移动构造函数,因为为了让 x 在移动后仍然是一个有效的对象,它需要自己分配的内存区域。我已经以这样一种方式编写了析构函数,它会在从 c API 调用相应的清理函数之前首先检查 NULL 指针,以便在移动后至少可以安全地销毁结构。
c++ - 什么是“将移动语义扩展到 *this”?
拜托,有人可以用简单的英语解释什么是“将移动语义扩展到 *this”吗?我指的是这个提议。所有我正在寻找的是那是什么以及我们为什么需要它。请注意,我确实了解通常的右值引用是什么,移动语义是基于该引用构建的。我无法掌握这样的扩展为右值引用添加了什么!
c++ - 添加移动构造函数和移动赋值运算符何时会真正开始有所作为?
考虑到当今编译器在返回值优化方面的高质量(RVO 和 NRVO),我想知道开始添加移动构造函数和移动赋值运算符实际上对什么类复杂度有意义。
例如,对于这个really_trivial
类,我只是假设移动语义不能提供比 RVO 和 NRVO 在复制它的实例时已经提供的任何东西:
在这个semi_complex
类中,我会毫不犹豫地添加一个移动构造函数和移动赋值运算符:
那么,添加移动构造函数和移动赋值运算符的成员变量的数量和种类开始变得有意义?
c++ - C++ 移动语义和异常
在即将到来的 C++0x 标准中,当在移动构造函数内/期间抛出异常时会发生什么?
原始对象会保留吗?还是原始对象和移动对象都处于未定义状态?语言提供了哪些保证?
c++ - 为什么没有默认的移动分配/移动构造函数?
我是一个简单的程序员。我的类成员变量通常由 POD 类型和 STL 容器组成。因此,我很少需要编写赋值运算符或复制构造函数,因为它们是默认实现的。
除此之外,如果我std::move
在不可移动的对象上使用它,它会使用赋值运算符,这意味着std::move
非常安全。
由于我是一个简单的程序员,我想利用移动功能而不向我编写的每个类添加移动构造函数/赋值运算符,因为编译器可以简单地将它们实现为“ this->member1_ = std::move(other.member1_);...
”
但它没有(至少在 Visual 2010 中没有),这有什么特别的原因吗?
更重要的是; 有什么办法可以解决这个问题吗?
更新: 如果你看不起 GManNickG 的回答,他为此提供了一个很棒的宏。如果你不知道,如果你实现了移动语义,你可以删除交换成员函数。
c++ - 如何返回 fstream (C++0x)
我想我会直接进入它并从代码开始:
基本上,我需要返回一个 ofstream。当然,你不能复制 ofstream,所以我在类测试中摆弄了代码,我得到了上面的编译和工作,就像你期望的那样(在 gcc 4.5 上)。
但我有一种不好的感觉,这只是因为我的编译器在“auto os = test()”上做了“返回值优化”(RTO)。确实,如果修改为以下内容:
我不再在输出中同时得到 Test1 和 Test2 。
问题是,“test”类是不可复制的,因此 ofstream 不可能被复制。我只是希望能够从函数中返回它。我似乎可以用 GCC 做到这一点。
我宁愿不要取消引用指向分配的流的堆的智能指针,也不要重新打开文件,因为它目前可以在不做这些事情的情况下工作。我只是觉得我的方法有点“不标准”,所以用标准的方式来做我所描述的事情会很棒。