move-semantics相关内容
这是什么? 它有什么作用? 应该什么时候使用? 感谢好的链接. 解决方案 维基百科页面关于 C++11 R 值引用和移动构造函数 在 C++11 中,除了复制构造函数之外,对象还可以有移动构造函数. (除了复制赋值运算符,它们还有移动赋值运算符.) 如果对象具有“右值引用"类型(Type &&),则使用移动构造函数而不是复制构造函数. std::move() 是一个强
..
我正在尝试理解 C++11 的右值引用和移动语义. 这些例子有什么区别,哪些不做向量复制? 第一个例子 std::vector返回向量(无效){std::vectortmp {1,2,3,4,5};返回 tmp;}std::vector&&rval_ref = return_vector(); 第二个例子 std::vector&&返回向量(无效){std::vectortmp
..
我有一个 std::vector 某个类 A 的对象.这个类很重要,并且定义了复制构造函数和移动构造函数. std::vectormyvec; 如果我用 A 对象填充向量(例如使用 myvec.push_back(a)),向量将增大,使用复制构造函数 A( const A&) 来实例化向量中元素的新副本. 我可以以某种方式强制使用 A 类的移动构造函数吗? 解决方案 您需要使用
..
在 clang 的 C++11 状态页面中遇到了一个名为“*this 的右值引用"的提议.> 我已经阅读了很多关于右值引用的内容并理解了它们,但我认为我不知道这一点.我也无法使用这些术语在网络上找到太多资源. 页面上有提案文件的链接:N2439(将移动语义扩展到 *this),但我也没有从那里得到太多示例. 这个功能是关于什么的? 解决方案 首先,“ref-qualifier
..
这是C++ Primer 5th Edition的练习: 练习 13.53:由于低级效率问题,HasPtr赋值运算符并不理想.解释为什么.实施一个HasPtr 的复制赋值和移动赋值运算符并进行比较在新的移动赋值运算符中执行的操作与复制和交换版本.(P.544) 文件hasptr.h: //!一个持有 std::string* 的类类 HasPtr{朋友无效交换(HasPtr&, Ha
..
如此答案中所述,复制和交换习语的实现方式如下: class MyClass{私人的:大类数据;UnmovableClass *dataPtr;民众:我的课(): data(), dataPtr(new UnmovableClass) { }MyClass(const MyClass& 其他): 数据(other.data), dataPtr(new UnmovableClass(*other.d
..
std::array 是否可移动? 在 Bjarne Native 2012 演示幻灯片(幻灯片 41)中,它列出了std::array 作为唯一不可移动的容器之一. 快速查看 gcc 4.8 库源代码似乎确认 std::array 不可移动: 标准::向量: /* @brief %Vector 移动构造函数.... */向量(向量&& __x)noexcept: _Base(
..
我有一个像这样的班级成员 class 控制器 {受保护://其他的东西std::vector>任务处理程序;//还有一些东西} Task 类是非 defaultConstructible、非 copyConstructible、非 copyAssignable,但是是 moveConstructible 和 moveAssignable.我能读到的所有内容(特别是 std::vector 文档
..
制作仅移动类型映射的向量在 Windows 上似乎无法正常工作.在此处查看代码:https://godbolt.org/z/yAHmzh #include #include #include //向量>作品无效的 foo() {std::vector>>外;std::vector>内;std::unique_ptrp = std:
..
我正在尝试研究移动语义如何影响引用透明度. 参照透明 (RT) 允许我们用其结果替换任何表达式而不改变程序的含义(意译来自 桶:返回桶(东西+ [“沙子"])bucket_with_sand(leaves) # 可以用 Bucket(["leaves", "sand"]) 代替,程序不变 而这个函数就地改变了它的参数 def bucket_with_sand(things: List
..
此处显示意图的代码: templateB级{上市://这确实应该将 t_ 设置为对 t 的引用B(T& t):t_(t){}//这应该将 t_ 设置为 t 的副本B(T&& t):t_(t){}夯;t_;//也许类型应该是别的东西?};一个;Bb1(a);//美好的B b2(A());//问题 有可能吗? 解决方案 在 C++17 中,使用 类模板参数推导(CTAD),你可能会这样做:
..
类 Foo 有一个右值引用构造函数,用于移动 unique_ptr 的包含向量,那么为什么以下代码会给出以下错误,无论是否带有 std::move 在 main 中的 Foo() 上? error C2280: 'std::unique_ptr>&std::unique_ptr>>::operator =(const std::uniqu
..
在stdlibstring.rs: impl Add;对于字符串{类型输出 = 字符串;#[排队]fn add(mut self, other: &str) ->细绳 {self.push_str(other);自己}}让 s1 = String::from(“tic");让 s2 = String::from(“tac");让 s = s1 + &s2;//有效 s1 在这里是不可变的,但是
..
假设我正在实现一个集合并且我想向其中添加一个元素,例如. template 类 MyCollection{void add(const T& element);}; 现在,由于添加元素通常意味着复制它,因此出于效率原因,使用以下版本的 add 以及 void add(T&& element).现在的问题是,显然这两个函数的代码是完全一样的,只是参数类型不同.目前我对C++的掌握是有限的,但我想
..
我有一个简单的类结构,对离散模拟进行建模,带有一个状态向量,每个状态包含许多转换,作为智能指针的向量.我使用智能指针来保存转换,因为在我的完整应用程序中我需要多态性. #include #include 类转换{上市:过渡() {}};类状态{上市:State(int num) : num(num), transitions() {}void add_transition(std::unique
..
来自 这本书: 如果类型或其任何部分实现了 Drop 特征,Rust 不会让我们用 Copy 特征注释类型.如果该类型需要在值超出范围时发生特殊情况,并且我们向该类型添加 Copy 注释,我们将收到编译时错误. 为什么设计决定不允许在同一类型上使用 Copy 和 Drop? 解决方案 Drop 特性用于 RAII 上下文,通常当对象被销毁时需要释放/关闭某些资源时. 另一方面
..
我正在阅读 Rust Book 的第二版,我在迭代器部分找到了以下示例: let v1 = vec![1, 2, 3];让 v1_iter = v1.iter();对于 v1_iter 中的 val {println!("得到:{}", val);} 为什么编译器不抱怨 v1_iter 是不可变的?这本书说 for 循环取得了 v1_iter 的所有权,并使其在幕后可变,但是你可以将不可变变量
..
主要由 fredoverflow(用户 237K 代表)在他的两个答案中解释的所有内容 https://stackoverflow.com/a/3109981/11862989 https://stackoverflow.com/a/11540204/11862989 但是在实现移动构造函数和重载移动赋值运算符(OMAO)(我在整个问题中都使用这些简短形式)时,我遇到了一些问题,我将
..
我有两个对象,其中第二个对象需要第一个对象的生命周期更长,因为它持有对第一个对象的引用.我需要将它们都移动到线程中,但是编译器抱怨第一个没有足够长的生存期.这是代码: 使用std :: thread;特质外观:同步{fn add(& self)->u32;}结构RoutingNode{外墙:&'a(Facade +'a),}暗示RoutingNode{fn new(facade:
..
什么是隐式移动构造函数执行成员级移动,而隐式移动分配运算符执行成员级分配? 来自 https://en.cppreference.com/w/cpp/language/move_constructor : 对于非联盟类类型(类和结构), move构造函数执行对象基础的完整成员移动,并且是非静态的成员,按照其初始化顺序,使用直接初始化带有xvalue参数.如果满足constexpr构造函
..