草庐IT

btn-move-forward

全部标签

c++ - 为什么 vector 的 move ctor 不推导出 noexcept()?

为什么要为std::vectormove构造函数使用自定义分配器不会推断出noexcept()来自分配器的行为?这导致封装此类vector的类无法形成可以在某些中正常move的(其他)vector秒。即使基础类型满足必要的要求(MoveInsertable和DefaultInsertable)。 最佳答案 我假设“使用自定义分配器为std::vectormove构造函数”是指分配器扩展的move构造函数,即这个构造函数:vector(vector&&v,constallocator_type&a);主要原因是如果v.get_allo

move 操作后 C++ lambda ‘this’ 指针失效

我当前的项目中有以下(简化的)代码:#include#include#include#includeclassTest{public:Test()=default;Test(constTest&other)=delete;Test&operator=(constTest&other)=delete;Test(Test&&other)=default;Test&operator=(Test&&other)=default;voidsetFunction(){lambda=[this](){a=2;};}intcallAndReturn(){lambda();returna;}privat

c++ - 使用 move ctor 的 constexpr 对象的 constexpr 数组

我有一个带有constexpr值构造函数的类,但没有复制或移动构造函数classC{public:constexprC(int){}C(constC&)=delete;C&operator=(constC&)=delete;};intmain(){constexprCarr[]={1,2};}我发现这段代码不起作用,因为它实际上是在尝试使用C的移动构造函数而不是值构造函数来就地构造。一个问题是我希望此对象不可移动(出于测试目的),但我想“好吧,好吧,我将添加一个移动构造函数。”classC{public:constexprC(int){}C(constC&)=delete;C&oper

c++ - 有没有权威的方法来防范c++中的 "use after move"错误?

我发现开发人员很容易犯这些错误。是否有避免这种情况的最佳实践或权威方法?是否有适用于多个平台的编译器标志或提示? 最佳答案 一个有效的经验法则:永远不要使用std::move或std::forward并且永远不要类型转换为右值(或通用)引用。如果您从不从变量或引用移动,那么您就不会犯在之后使用它的错误。这种方法显然有一个缺点,因为这些实用程序在某些情况下可用于在移动足够时将拷贝转换为移动;更不用说必要的情况了。适用于您自己的类型的方法:将断言添加到成员函数中,以验证实例是否已从中移出,并依赖它们在测试期间触发。“移动”状态将需要存储

c++ - 使用 std::forward 而不是 std::move 来初始化对象有什么好处吗?

我有一个函数模板,它采用某种可调用类型的参数,并使用std::bind为原始可调用对象创建一个具有预定义参数值的新可调用对象。我用转发引用参数和std::forward编写了它,如下所示:templateautomake_example_caller(F&&f){returnstd::bind(std::forward(f),123,456,789);}cppreferencedocumentationforstd::bind表示绑定(bind)对象“包含一个由std::decay::type构造的std::forward(f)类型的成员对象”。由于std::bind将函数转发给它的内

c++ - std::forward_list 成员可以实现为静态的吗?

std::forward_list提供了insert_after和erase_after成员,它们可能不需要实际访问std::forward_list对象。因此,它们可以作为static成员函数实现,并且可以在没有列表对象的情况下被调用——对于想要从列表中删除自身的对象很有用,这是一种非常常见的用法。编辑:此优化仅适用于std::allocator或用户定义的无状态分配器的forward_list特化。符合标准的实现可以做到这一点吗?§17.6.5.5/3说AcalltoamemberfunctionsignaturedescribedintheC++standardlibrarybe

c++ - 使用 std::move 传入一个临时 lambda,或者向 "pull"输出一个临时参数,有什么区别?

我有以下(设计的)代码,其中我有一个带有单个打印函数的打印机类和一个处理字符串然后调用打印函数回调函数的工作类:#include#includeusingcallback_fn=std::function;classprinter{public:boolprint(std::stringdata){std::cout注意:我调用了两次std::move()...现在这有效(令我惊讶),但我两次调用都只是为了展示我是什么试。我的问题是:我是否应该在set_callback()函数中使用std::move()来“提取”温度,如果我使用它,是否真的有一个拷贝还是std::move()意味着它

c++ - 如果类包含标准容器,我可以将类 move 操作标记为 noexcept 吗?

在具有标准容器成员的类上实现move操作的惯用方法不能是noexcept因此不能通过vector.push_back()等操作move.还是我弄错了?从中获取速度vectordata;//...data.push_back(elem);鼓励我们进行move操作noexcept--因此在vector调整大小时,库可以安全地将元素move到重新分配的存储空间。classElem{//...Elem(Elem&&)noexcept;//noexceptimportantformoveElem&operator=(Elem&&)noexcept;//noexceptimportantformo

c++ - move 语义和原始类型

示例代码:intmain(){std::vectorv1{1,2,3,4,5,6,7,8,9,10};std::coutv2(std::make_move_iterator(v1.begin()),std::make_move_iterator(v1.end()));std::coutv3{"some","stuff","to","put","in","the","strings"};std::coutv4(std::make_move_iterator(v3.begin()),std::make_move_iterator(v3.end()));std::cout输出:Printin

c++ - std::move 是否应该用于 return-statements 以提高效率?

我不知道下面代码中的std::move是做了什么好事还是完全错误?Object类同时定义了Move和Copy构造函数。首先:随着move:templatetemplateconstObjectObject::operator*(constF&rhs)const{returnstd::move(Object(*this)*=rhs);//Weendinmoveconstructor}第二种:不move:templatetemplateconstObjectObject::operator*(constF&rhs)const{returnObject(*this)*=rhs;//Weend