草庐IT

moving-average

全部标签

c++ - move 语义和函数顺序评估

假设我有以下内容:#includestructA{intx;};classB{B(intx,std::unique_ptra);};classC:publicB{C(std::unique_ptra):B(a->x,std::move(a)){}};如果我正确理解有关“函数参数的未指定顺序”的C++规则,则此代码是不安全的。如果B的构造函数的第二个参数首先使用move构造函数构造,那么a现在包含一个nullptr和表达式a->x将触发未定义的行为(可能是段错误)。如果首先构造第一个参数,那么一切都会按预期工作。如果这是一个普通的函数调用,我们可以创建一个临时的:autox=a->xBb

c++ - std::function 的仅 move 版本

因为std::function是可复制的,标准要求用于构造它的可调用对象也是可复制的:n337(20.8.11.2.1)templatefunction(Ff);Requires:FshallbeCopyConstructible.fshallbeCallable(20.8.11.2)forargumenttypesArgTypesandreturntypeR.ThecopyconstructoranddestructorofAshallnotthrowexceptions.`这意味着不可能形成std::function来自不可复制的绑定(bind)对象或捕获仅move类型的lambd

c++ - 为什么有些人使用交换进行 move 分配?

例如,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*this;}为什么不直接将两个__u成员分配给*this呢?交换是否意味着__u被分配了*this成员,只是后来分配了0和false......在这种情况下,交换正在做不必要的工作。我错过了什么?(unique_lock::swap只是对每个成员执行std::swap)

c++ - 当基类不是时,为什么派生类可以 move 构造?

考虑以下示例:#include#include#includetemplatestructFoo:publicBase{usingBase::Base;};structBar{Bar(constBar&){}Bar(Bar&&)=delete;};intmain(){std::cout::value>::value为什么编译器生成一个move构造函数,尽管基类是不可move构造的?这是标准还是编译器错误?是否可以“完美地传播”将构造从基类move到派生类? 最佳答案 因为:Adefaultedmoveconstructorthati

c++ - pass-by-value-and-then-move 结构是一个坏习惯吗?

由于我们在C++中有move语义,现在通常这样做voidset_a(Aa){_a=std::move(a);}原因是,如果a是一个右值,则拷贝将被省略,并且只有一步。但是如果a是左值会发生什么?似乎会有一个复制构造,然后是一个move赋值(假设A有一个正确的move赋值运算符)。如果对象具有太多成员变量,则move分配的成本可能会很高。另一方面,如果我们这样做了voidset_a(constA&a){_a=a;}只有一份拷贝分配。如果我们要传递左值,我们可以说这种方式优于按值传递的习惯用法吗? 最佳答案 昂贵的move类型在现代C+

c++ - 为什么在 C++11 中有 && 时使用 std::move?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Whatismovesemantics?我最近参加了一个C++11研讨会,并给出了以下建议。whenyouhave&&andyouareunsure,youwillalmostalwaysusestd::move谁能向我解释为什么您应该使用std::move而不是某些替代方案以及某些不应该使用std::move的情况? 最佳答案 首先,我要解决的问题可能存在误解:每当你看到T&&t在代码中(并且T是实际类型,不是模板类型),请记住t的值类别是左值(引用),不

c++ - 我可以通常/总是使用 std::forward 而不是 std::move 吗?

我一直在看ScottMeyers的talkonUniversalReferences来自C++andBeyond2012session,到目前为止一切都说得通。然而,一位观众在大约50分钟时提出了一个我也想知道的问题。Meyers说他不关心答案,因为它不习惯用语并且会让他觉得很傻,但我仍然感兴趣。呈现的代码如下://Typicalfunctionbodieswithoverloading:voiddoWork(constWidget¶m)//copy{//opsandexprsusingparam}voiddoWork(Widget&¶m)//move{//opsand

c++ - move 构造函数和 `std::array`

根据N3485§23.3.2.2:(...)theimplicitmoveconstructorandmoveassignmentoperatorforarrayrequirethatTbeMoveConstructibleorMoveAssignable,respectively.所以,std::array支持move语义,如果它的元素类型支持的话。太好了!但是,这究竟意味着什么?我倾向于将这种类型描绘为提供符合STL接口(interface)的数组的更安全版本,但如果这是真的,那么std::array如何move构造其元素?我可以对普通数组做同样的事情吗?

c++ - move 构造函数和 `std::array`

根据N3485§23.3.2.2:(...)theimplicitmoveconstructorandmoveassignmentoperatorforarrayrequirethatTbeMoveConstructibleorMoveAssignable,respectively.所以,std::array支持move语义,如果它的元素类型支持的话。太好了!但是,这究竟意味着什么?我倾向于将这种类型描绘为提供符合STL接口(interface)的数组的更安全版本,但如果这是真的,那么std::array如何move构造其元素?我可以对普通数组做同样的事情吗?

c++ - 使用 std::move() 是不是过早的优化?

假设我有以下代码:intmain(){std::vectorstrs;std::stringvar("HelloWorld");//Makesomemodificationsto'var'strs.push_back(std::move(var));}我要指出的示例部分是std::move()的用法。基本上我担心push_back()调用的拷贝。假设我要添加的字符串非常大。我仍在学习C++11右值引用,所以我不确定编译器如何在没有std::move()的情况下优化拷贝(如果有的话)。谁能解释这是否是一种过早的优化(通常在所有要避免复制的情况下强制移动)?如果是这样,我应该期望编译器遵循