move-semantics相关内容
可能重复: 如何在向量增长时执行移动语义? 插入, push_back 和 emplace ( _back )可以导致重新分配 std :: vector 。在重新分配容器时,我发现下面的代码复制 而不是移动,我很困惑。 #include #include struct foo { int value; explic
..
我知道通常不是一个好主意返回 std :: move ,即 bigObject foo(){bigObject result; /*...*/ return std :: move(result); } 而不是简单 bigObject foo(){bigObject result; /*...*/ return result; } ,因为它阻碍
..
例如,stdlibc ++具有以下属性: unique_lock& operator =(unique_lock&& __u) { if(_M_owns) unlock(); unique_lock(std :: move(__ u))。swap(* this); __u._M_device = 0; __u._M_owns = false; return * thi
..
在C ++ 98中,C ++编译器可以通过成员自动拷贝自动生成拷贝构造函数和拷贝赋值运算符,例如 struct X { std :: string s; std :: vector v; int n; }; 编译器自动为 但是,如何在C ++ 11中使用移动语义来改变? 是移动 构造函数和 移动 / strong>自动生成
..
考虑一个 X 与 N 成员变量,每个可复制 可移动类型和 N 对应的设置器函数。 在C ++ 98中, X 的定义可能如下所示: class X { public: void set_a(A const& a){_a = a; } void set_b(B const& b){_b = b; } ... private: A _a; B _b; ... }
..
N3485 17.6.5.15 [lib.types.movedfrom] / 1: 在C ++标准库中定义的类型对象可以从(12.8)移动。可以显式指定或隐式生成移动操作 。除非另有说明,否则此类移动对象应置于有效但未指定的状态。 code> vector 明确将其从此段落中排除。然而,我不能想出一个正确的实现,将导致向量不为空。 有一些标准,这意味着我失踪或是类似于处理 b
..
我有一个有unique_ptr成员的类。 class Foo { private: std :: unique_ptr酒吧; ... }; Bar是具有create()函数和destroy()函数的第三方类。 如果我想在一个独立的函数中使用 std :: unique_ptr / p> void foo(){ std ::
..
UPDATE 在底部 q1:如何实现
..
我在某处看到代码,其中某人决定复制对象,然后将其移动到类的数据成员。这让我困惑,因为我认为移动的整个要点是避免复制。下面是示例: struct S { S(std :: string str):data (std :: move(str)) {} }; 以下是我的问题: 为什么我们不是对 str 进行右值引用? ,特别是给予 std ::
..
这个程序试图将一个字符串从一个函数中移出,并用于构造另一个字符串: #include #include #include std :: string&& Get_String(void); int main(){ std :: string str {Get_String()}; std ::
..
C ++ 11标准关于标准库的自我移动赋值是什么?更具体地说,如何保证什么是 selfAssign ? template std :: vector selfAssign(std :: vector v){ v = std :: move(v); return v; } 解决方案 17.6.4.9函数参数[ res.on.a
..
可能重复: 我最近参加了一个C ++ 11研讨会,并给出了以下建议。 &&&并且你不确定,你几乎总是使用std :: move 您应该使用 std :: move 而不是某些替代方案,以及在您不应使用 std :: move ? 解决方案 首先,我会解决的问题可能有一个误解: 每当你看到 T&& t 在代码中(And T是一个实际类型,而不是模板类型)
..
我一直在看Scott Meyers的在C ++和Beyond 2012会议上讨论通用引用,到目前为止,一切都有意义。然而,观众成员在大约50分钟时问一个问题,我也想知道。 Meyers说他不关心答案,因为它是非惯用的,会愚蠢他的心,但我仍然感兴趣。 代码如下: //重载的典型函数体: void doWork(const Widget& param)// copy { // o
..
我一直在试图围绕C ++ 11中的移动语义如何工作,而且我很难理解移动对象需要满足的条件。查看这里的答案不能真正解决我的问题,因为不能看到如何以明智的方式将它应用于pimpl对象,尽管移动语义是完美的pimpls 。 我的问题的最简单的例子涉及pimpl成语,如下: class Foo { std :: unique_ptr impl_; public:
..
重新使用移动的容器的正确方法是什么? std :: vector
..
当函数应返回RValue参考时,是否有原因?一种技术或诀窍,或成语或模式? MyClass&& func(...); 我知道一般返回引用,但有时我们这样做,不是我们( T& T :: operator = (T)只是一个惯用的例子)。但是 T&& func(...)?有没有什么一般的地方,我们会从中获益? 解决方案 有一些情况下,当适当的时候,但它们相对较少。当
..
在类的赋值运算符中,你通常需要检查被赋值的对象是否是调用对象,所以你不会搞错: Class :: operator =(const Class& rhs){ if(this!=& rhs){ //做作业 } return *这个; } 你需要移动赋值操作符是否有这样的情况, this ==& rhs 是真的? ? Class :: operator
..
在这种情况下 struct Foo {}; Foo meh(){ return std :: move(Foo()); } 我确定移动是不必要的,因为新创建的 但是在这样的情况下呢? struct Foo {}; Foo meh(){ Foo foo; //做某事,但是知道foo可以安全地处理 //但是编译器必须知道吗? //我们可
..
是什么? 它是什么? > 良好的链接。 解决方案 http://en.wikipedia.org/wiki/C%2B%2B11#Rvalue_references_and_move_constructors http://www.open- std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics
..
我允许将元素移出 std :: initializer_list ? #include #include template void foo(std :: initializer_list list) { for(auto it = list.begin(); it!=
..