move-semantics相关内容

什么是 std::move(),什么时候应该使用?

这是什么? 它有什么作用? 应该什么时候使用? 感谢好的链接. 解决方案 维基百科页面关于 C++11 R 值引用和移动构造函数 在 C++11 中,除了复制构造函数之外,对象还可以有移动构造函数. (除了复制赋值运算符,它们还有移动赋值运算符.) 如果对象具有“右值引用"类型(Type &&),则使用移动构造函数而不是复制构造函数. std::move() 是一个强 ..
发布时间:2021-12-01 15:30:47 C/C++开发

当向量增长时如何强制移动语义?

我有一个 std::vector 某个类 A 的对象.这个类很重要,并且定义了复制构造函数和移动构造函数. std::vectormyvec; 如果我用 A 对象填充向量(例如使用 myvec.push_back(a)),向量将增大,使用复制构造函数 A( const A&) 来实例化向量中元素的新副本. 我可以以某种方式强制使用 A 类的移动构造函数吗? 解决方案 您需要使用 ..
发布时间:2021-12-01 15:18:21 C/C++开发

什么是“*this"的右值引用?

在 clang 的 C++11 状态页面中遇到了一个名为“*this 的右值引用"的提议.> 我已经阅读了很多关于右值引用的内容并理解了它们,但我认为我不知道这一点.我也无法使用这些术语在网络上找到太多资源. 页面上有提案文件的链接:N2439(将移动语义扩展到 *this),但我也没有从那里得到太多示例. 这个功能是关于什么的? 解决方案 首先,“ref-qualifier ..
发布时间:2021-12-01 15:08:00 C/C++开发

为什么使用单个赋值运算符处理复制和移动赋值效率不高?

这是C++ Primer 5th Edition的练习: 练习 13.53:由于低级效率问题,HasPtr赋值运算符并不理想.解释为什么.实施一个HasPtr 的复制赋值和移动赋值运算符并进行比较在新的移动赋值运算符中执行的操作与复制和交换版本.(P.544) 文件hasptr.h: //!一个持有 std::string* 的类类 HasPtr{朋友无效交换(HasPtr&, Ha ..

std::array 是可移动的吗?

std::array 是否可移动? 在 Bjarne Native 2012 演示幻灯片(幻灯片 41)中,它列出了std::array 作为唯一不可移动的容器之一. 快速查看 gcc 4.8 库源代码似乎确认 std::array 不可移动: 标准::向量: /* @brief %Vector 移动构造函数.... */向量(向量&& __x)noexcept: _Base( ..
发布时间:2021-11-18 03:22:05 C/C++开发

“结果类型必须可从输入范围的值类型构造"创建 std::vector 时

我有一个像这样的班级成员 class 控制器 {受保护://其他的东西std::vector>任务处理程序;//还有一些东西} Task 类是非 defaultConstructible、非 copyConstructible、非 copyAssignable,但是是 moveConstructible 和 moveAssignable.我能读到的所有内容(特别是 std::vector 文档 ..
发布时间:2021-09-17 19:08:04 C/C++开发

vector>不能用 MSVC 编译

制作仅移动类型映射的向量在 Windows 上似乎无法正常工作.在此处查看代码:https://godbolt.org/z/yAHmzh #include #include #include //向量>作品无效的 foo() {std::vector>>外;std::vector>内;std::unique_ptrp = std: ..
发布时间:2021-09-17 19:04:02 C/C++开发

移动语义对于 Rust 中的引用透明性意味着什么?

我正在尝试研究移动语义如何影响引用透明度. 参照透明 (RT) 允许我们用其结果替换任何表达式而不改变程序的含义(意译来自 桶:返回桶(东西+ [“沙子"])bucket_with_sand(leaves) # 可以用 Bucket(["leaves", "sand"]) 代替,程序不变 而这个函数就地改变了它的参数 def bucket_with_sand(things: List ..

c++类同居的copy(reference)构造函数和move构造函数

此处显示意图的代码: templateB级{上市://这确实应该将 t_ 设置为对 t 的引用B(T& t):t_(t){}//这应该将 t_ 设置为 t 的副本B(T&& t):t_(t){}夯;t_;//也许类型应该是别的东西?};一个;Bb1(a);//美好的B b2(A());//问题 有可能吗? 解决方案 在 C++17 中,使用 类模板参数推导(CTAD),你可能会这样做: ..

如何定义一个函数来处理移动语义和复制语义?

假设我正在实现一个集合并且我想向其中添加一个元素,例如. template 类 MyCollection{void add(const T& element);}; 现在,由于添加元素通常意味着复制它,因此出于效率原因,使用以下版本的 add 以及 void add(T&& element).现在的问题是,显然这两个函数的代码是完全一样的,只是参数类型不同.目前我对C++的掌握是有限的,但我想 ..
发布时间:2021-06-04 18:31:21 C/C++开发

在 C++ 中将具有 unique_ptr 的对象推入向量

我有一个简单的类结构,对离散模拟进行建模,带有一个状态向量,每个状态包含许多转换,作为智能指针的向量.我使用智能指针来保存转换,因为在我的完整应用程序中我需要多态性. #include #include 类转换{上市:过渡() {}};类状态{上市:State(int num) : num(num), transitions() {}void add_transition(std::unique ..
发布时间:2021-06-04 18:31:16 C/C++开发

为什么 Rust 不允许在一种类型上复制和删除特征?

来自 这本书: 如果类型或其任何部分实现了 Drop 特征,Rust 不会让我们用 Copy 特征注释类型.如果该类型需要在值超出范围时发生特殊情况,并且我们向该类型添加 Copy 注释,我们将收到编译时错误. 为什么设计决定不允许在同一类型上使用 Copy 和 Drop? 解决方案 Drop 特性用于 RAII 上下文,通常当对象被销毁时需要释放/关闭某些资源时. 另一方面 ..
发布时间:2021-06-04 18:31:13 其他开发

为什么编译器不抱怨移动到 for 循环的迭代器是不可变的?

我正在阅读 Rust Book 的第二版,我在迭代器部分找到了以下示例: let v1 = vec![1, 2, 3];让 v1_iter = v1.iter();对于 v1_iter 中的 val {println!("得到:{}", val);} 为什么编译器不抱怨 v1_iter 是不可变的?这本书说 for 循环取得了 v1_iter 的所有权,并使其在幕后可变,但是你可以将不可变变量 ..
发布时间:2021-06-04 18:31:08 其他开发

将两个对象(其中一个持有对另一个对象的引用)传递到线程中

我有两个对象,其中第二个对象需要第一个对象的生命周期更长,因为它持有对第一个对象的引用.我需要将它们都移动到线程中,但是编译器抱怨第一个没有足够长的生存期.这是代码: 使用std :: thread;特质外观:同步{fn add(& self)->u32;}结构RoutingNode{外墙:&'a(Facade +'a),}暗示RoutingNode{fn new(facade: ..
发布时间:2021-05-29 20:44:51 其他开发

隐式移动构造函数和赋值运算符

什么是隐式移动构造函数执行成员级移动,而隐式移动分配运算符执行成员级分配? 来自 https://en.cppreference.com/w/cpp/language/move_constructor : 对于非联盟类类型(类和结构), move构造函数执行对象基础的完整成员移动,并且是非静态的成员,按照其初始化顺序,使用直接初始化带有xvalue参数.如果满足constexpr构造函 ..
发布时间:2021-05-28 20:20:16 C/C++开发