Questions tagged «move-semantics»

12
什么是移动语义?
我刚刚结束了对Scott Meyers进行的有关C ++ 0x的Software Engineering广播播客采访。大多数新功能对我来说都是有意义的,除了一个功能,我现在对C ++ 0x感到非常兴奋。我仍然没有移动语义 ……这到底是什么?

7
push_back和emplace_back
我对push_back和之间的区别感到困惑emplace_back。 void emplace_back(Type&& _Val); void push_back(const Type& _Val); void push_back(Type&& _Val); 由于有一个push_back重载引用右值引用,我不太明白它的目的是emplace_back什么?


6
C ++ 11右值和移动语义混淆(返回语句)
我试图理解右值引用并移动C ++ 11的语义。 这些示例之间有什么区别,哪些将不进行矢量复制? 第一个例子 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); 第二个例子 std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector(); 第三个例子 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();

3
什么是“ * this的右值参考”?
在clang的C ++ 11状态页面中遇到了一个名为“ * this的右值引用”的提案。 我已经阅读了很多有关右值引用并理解它们的知识,但我认为我对此并不了解。使用这些条款,我在网络上也找不到太多资源。 该页面上有一份建议书链接:N2439(将移动语义扩展到* this),但我从那里也没有太多示例。 这个功能是关于什么的?

2
现代C ++可以免费为您提供性能吗?
有时有人声称C ++ 11/14可以提高性能,即使仅编译C ++ 98代码也可以。理由通常是根据移动语义的,因为在某些情况下,右值构造函数是自动生成的,或者现在是STL的一部分。现在,我想知道以前是否已经通过RVO或类似的编译器优化处理了这些情况。 然后我的问题是,是否可以给我一个C ++ 98代码的实际示例,该示例无需修改即可使用支持新语言功能的编译器更快地运行。我确实理解不需要标准兼容的编译器来执行复制省略,仅由于这个原因,移动语义可能会带来速度,但是如果您愿意,我希望看到一种病态较少的情况。 编辑:为了清楚起见,我不是在问新的编译器是否比旧的编译器快,而是如果有代码将-std = c ++ 14添加到我的编译器标志中,它将运行得更快(避免复制,但是如果您除了移动语义之外,还可以提出其他建议,我也很感兴趣)

6
我为什么要std :: move一个std :: shared_ptr?
我一直在浏览Clang源代码,发现以下代码段: void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } 我为什么要std::move一个std::shared_ptr? 在共享资源上转移所有权有什么意义吗? 我为什么不这样做呢? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }

2
我如何处理移出的物体?
该标准是否精确定义了对象从对象移出后可以做什么?我曾经认为,对移出的对象可以做的只是破坏它,但这还不够。 例如,采用swap标准库中定义的功能模板: template <typename T> void swap(T& a, T& b) { T c = std::move(a); // line 1 a = std::move(b); // line 2: assignment to moved-from object! b = std::move(c); // line 3: assignment to moved-from object! } 显然,必须可以将其分配给移出的对象,否则第2行和第3行将失败。那么我还能对移出的对象做什么呢?我在哪里可以在标准中找到这些详细信息? (顺便说一句,为什么T c = std::move(a);不是T c(std::move(a));第1行呢?)

6
如何将自定义删除器与std :: unique_ptr成员一起使用?
我有一个具有unique_ptr成员的课程。 class Foo { private: std::unique_ptr<Bar> bar; ... }; Bar是具有create()函数和destroy()函数的第三方类。 如果我想std::unique_ptr在独立功能中使用它,我可以这样做: void foo() { std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); }); ... } 有什么办法可以std::unique_ptr作为班级成员吗?


1
无法移出借用的内容/不能移出共享引用的后面
我不明白这个错误cannot move out of borrowed content。我已经收到了很多次,并且我一直都解决了它,但是我从来不明白为什么。 例如: for line in self.xslg_file.iter() { self.buffer.clear(); for current_char in line.into_bytes().iter() { self.buffer.push(*current_char as char); } println!("{}", line); } 产生错误: error[E0507]: cannot move out of borrowed content --> src/main.rs:31:33 | 31 | for current_char in line.into_bytes().iter() { | ^^^^ cannot move out of borrowed …

4
何时使类型在C ++ 11中不可移动?
令我惊讶的是,它没有出现在我的搜索结果中,考虑到C ++ 11中移动语义的用处,我想有人会问过这个问题: 什么时候需要(或者对我来说是个好主意)使类在C ++ 11中不可移动? (原因等比现有的代码,也就是兼容性问题。)

6
移动赋值运算符和`if(this!=&rhs)`
在类的赋值运算符中,通常需要检查被赋值的对象是否是调用对象,因此您无需搞砸: Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment } return *this; } 移动分配运算符是否需要相同的东西?有没有一种情况this == &rhs是对的? ? Class::operator=(Class&& rhs) { ? }

3
在基于范围的for循环中使用转发引用有什么好处?
const auto&如果我要执行只读操作就足够了。但是,我碰到了 for (auto&& e : v) // v is non-const 最近几次。这让我感到奇怪: 与auto&或相比,在某些晦涩难懂的情况下使用转发引用是否有一些性能优势const auto&? (shared_ptr疑似死角案件) 更新 在我的收藏夹中找到的两个示例: 遍历基本类型时使用const引用有什么缺点吗? 我可以使用基于范围的for循环轻松地迭代地图的值吗? 请集中讨论以下问题:为什么我要在基于范围的for循环中使用auto &&?

2
std :: move()如何将值转换为RValues?
我只是发现自己不完全了解的逻辑std::move()。 起初,我在Google上进行了搜索,但似乎只有有关如何使用的文档std::move(),而不是其结构的工作原理。 我的意思是,我知道模板成员函数是什么,但是当我查看std::move()VS2010中的定义时,它仍然令人困惑。 std :: move()的定义如下。 template<class _Ty> inline typename tr1::_Remove_reference<_Ty>::_Type&& move(_Ty&& _Arg) { // forward _Arg as movable return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); } 我最奇怪的是参数(_Ty && _Arg),因为当我像下面看到的那样调用该函数时, // main() Object obj1; Object obj2 = std::move(obj1); 它基本上等于 // std::move() _Ty&& _Arg = Obj1; 但是,正如您已经知道的那样,您不能直接将LValue链接到RValue引用,这使我认为它应该是这样的。 _Ty&& _Arg = (Object&&)obj1; 但是,这很荒谬,因为std :: move()必须适用于所有值。 因此,我想充分理解它是如何工作的,我也应该看看这些结构。 …

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.