Questions tagged «move-semantics»

4
我们为什么要复制然后移动?
我在某处看到的代码中有人决定复制一个对象,然后将其移动到类的数据成员中。这让我感到困惑,因为我认为移动的全部目的是避免复制。这是示例: struct S { S(std::string str) : data(std::move(str)) {} }; 这是我的问题: 为什么我们不采用右值引用str? 一份副本会不会很贵,特别是给类似的东西std::string吗? 作者决定复制然后搬家的原因是什么? 我什么时候应该自己做?

8
initializer_list并移动语义
我可以将元素移出std::initializer_list<T>吗? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } 由于std::intializer_list<T>需要特别注意编译器并且没有像C ++标准库的普通容器那样的值语义,因此,我宁愿安全而不愿后悔。

5
我可以对仅移动类型的向量进行列表初始化吗?
如果我通过GCC 4.7快照传递以下代码,它将尝试将unique_ptrs 复制到向量中。 #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } 显然,这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在尝试从初始化列表中复制指针时是否正确?

3
向量增长时如何执行移动语义?
我有std::vector某类的东西A。该类很简单,并定义了复制构造函数和 move构造函数。 std::vector<A> myvec; 如果我用A对象填充矢量(例如使用myvec.push_back(a)),则矢量的大小将增大,使用复制构造函数A( const A&)实例化矢量中元素的新副本。 我能以某种方式强制A使用class的move构造函数代替beging吗?

4
为什么没有默认的移动分配/移动构造函数?
我是一个简单的程序员。我的班级成员变量通常由POD类型和STL容器组成。因此,我很少需要编写赋值运算符或复制构造函数,因为它们是默认实现的。 此外,如果我std::move在不可移动的对象上使用它,则使用赋值运算符,这std::move是绝对安全的。 因为我是一个简单的程序员,所以我想利用移动功能,而不必在我编写的每个类中添加移动构造函数/赋值运算符,因为编译器可以将它们简单地实现为“ this->member1_ = std::move(other.member1_);...” 但这不是(至少在Visual 2010中不是),是否有任何特殊原因? 更重要的是; 有什么办法可以解决这个问题? 更新: 如果您不看GManNickG的答案,他为此提供了一个很好的宏。如果您不知道,如果您实现了移动语义,则可以删除掉swap成员函数。

2
具有已构建对象的std :: move与emplace_back()的C ++ 11 push_back()效率
在C ++ 11emplace_back()中(就效率而言)通常更可取,push_back()因为它允许就地构造,但是当push_back(std::move())与已经构造的对象一起使用时,仍然是这种情况吗? 例如,emplace_back()在以下情况下还是首选? std::string mystring("hello world"); std::vector<std::string> myvector; myvector.emplace_back(mystring); myvector.push_back(std::move(mystring)); // (of course assuming we don't care about using the value of mystring after) 另外,在上面的示例中代替这样做有什么好处: myvector.emplace_back(std::move(mystring)); 还是此举完全是多余的,还是没有效果?

3
重用已移动的容器?
重用已移动容器的正确方法是什么? std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2); 根据我在C ++ 0x标准草案中所读的内容;ver3似乎是正确的方法,因为移动后的对象位于 “除非另有规定,否则将这些移出的对象置于有效但未指定的状态。” 我从未发现过任何“以其他方式指定”的实例。 虽然我发现ver3有点round回,并且会更喜欢ver1,但是vec3可以允许进行其他一些优化,但另一方面很容易导致错误。 我的假设正确吗?


5
在任何情况下,返回RValue引用(&&)都是有用的吗?
函数应返回RValue引用吗?一种技术,技巧,成语或模式? MyClass&& func( ... ); 我知道一般会返回引用的危险,但是有时候我们还是这样做,不是吗?T& T::operator=(T)只是一个惯用的例子。但是T&& func(...)呢?有没有一般的地方可以从中受益呢?与仅编写客户端代码相比,编写库或API代码时可能有所不同吗?

7
传递值然后移动构成一个坏习惯吗?
由于我们在C ++中具有移动语义,因此如今很常见 void set_a(A a) { _a = std::move(a); } 理由是,如果a是右值,则副本将被删除,并且只有一招。 但是,如果a是左值会怎样?似乎将有一个副本构造,然后是一个移动分配(假设A具有正确的移动分配运算符)。如果对象具有太多的成员变量,则移动分配的成本可能很高。 另一方面,如果我们这样做 void set_a(const A& a) { _a = a; } 将只有一份副本分配。如果我们要传递左值,是否可以说这种方法比按值传递惯用法更可取?

1
没有“右值引用*此”功能的解决方法
我在可移动对象周围有一个代理容器类,并希望该代理能够隐式地产生对基础对象的右值引用,但仅当代理自身被移动时才是如此。 我相信我将能够按照建议n2439 “将移动语义扩展到* this”来实现此行为,但是它在gcc发行版中尚不可用,并且将有一段时间。 下面的代码是我最终的目标,但是目前无法实现。在我可以使用此功能之前,是否有任何等效的解决方法? template< class T > struct movable_proxy { operator T&&() && { return std::move(value); } operator const T&() const& { return value; } private: T value; };

4
允许从std :: map的键中窃取资源吗?
在C ++中,可以从以后不再需要的映射中窃取资源了吗?更准确地说,假设我有一个std::mapwith std::string键,并且我想通过使用窃取maps键的资源来构造一个向量std::move。请注意,对键的这种写访问会破坏的内部数据结构(键的顺序),map但此后我将不再使用它。 问题:我可以这样做没有任何问题吗?还是会导致意外的错误(例如,map由于我std::map以非预期的方式访问它)而导致了析构函数的错误? 这是一个示例程序: #include<map> #include<string> #include<vector> #include<iostream> using namespace std; int main(int argc, char *argv[]) { std::vector<std::pair<std::string,double>> v; { // new scope to make clear that m is not needed // after the resources were stolen std::map<std::string,double> m; m["aLongString"]=1.0; m["anotherLongString"]=2.0; // // now steal resources for (auto &p …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.