草庐IT

nothrow_move_constructible

全部标签

c++ - 如何为这个派生类编写 move 赋值函数?

DuetothisbuginVisualStudio2013,我需要为派生类提供自己的move构造函数和move赋值。但是,我不知道如何为基类调用适当的move函数。代码如下:#include//Baseclass;movable,non-copyableclassshader{public:virtual~shader(){if(id_!=INVALID_SHADER_ID){//Cleanup}}//Moveassignmentshader&operator=(shader&&other){//BrettHale'scommentbelowpointedoutaresourcele

c++ - 使用 std::move c++11 后会持续什么

在可能是类中的字段的变量中使用std::move之后:classA{public:vector&&stealVector(){returnstd::move(myVector);}voidrecreateMyVector(){}private:vectormyVector;};如何重新创建vector,就像一个清晰的?在std::move之后myVector中还剩下什么? 最佳答案 常见的说法是,已“移出”的变量处于有效但未指定的状态。这意味着可以销毁并分配给变量,但没有别的。(我相信Stepanov称其为“部分形成”,这是一个很好

c++ - 为什么这需要一个显式的 std::move?

假设我有一个Foo包含std::vector的类由std::unique_ptrbuild另一个类的对象,Bar.typedefstd::unique_ptrUniqueBar;classFoo{std::vectorbars;public:voidAddBar(UniqueBar&&bar);};voidFoo::AddBar(UniqueBar&&bar){bars.push_back(bar);}这会导致编译错误(在g++4.8.1中)说std::unique_ptr的复制构造函数被删除,这是合理的。这里的问题是,既然bar参数已经是一个右值引用,为什么std::unique_p

c++ - 抽象类和 move 语义

根据“五规则”,当我声明以下之一时:复制或move操作或析构函数我必须编写所有这些,因为编译器不会为我生成它们(其中一些)。但是,如果我的类(A)派生自带有虚拟析构函数的抽象类,这是否意味着A类中的析构函数将被视为“用户定义的”?因此,move语义是否不适用于此类A的对象,因为编译器不会为我生成move构造函数?structInterface{virtualvoidmyFunction()=0;virtual~Interface(){};};structA:publicInterface{voidmyFunction()override{};}; 最佳答案

c++ - 将 unique_ptrs 从一个 vector move 到另一个 vector

我想将存储在它们的未排序vector中的unique_ptrmove到另一个vector,该vector将包含指针的排序vector。确定moveunique_ptr不会自动删除第一个vector中的元素吗?我该怎么做?我想做的例子:std::vector>unsorted,sorted;//fillthe"unsorted"vectorwhile(unsorted.size()>0){constautoit=find_next_element_to_add_to_sorted(unsorted);sorted.push_back(std::move(*it));}我希望意图很明确。更

c++ - C++11 编译器何时会使 RVO 和 NRVO 优于 move 语义和 const 引用绑定(bind)?

考虑从函数返回启用move语义的“完整”对象的情况,如std::basic_string:std::wstringbuild_report()const{std::wstringreport;...returnreport;}那么,我是否真的可以做出“最佳”选择,是否将返回的字符串与move语义一起使用,如conststd::wstringreport(std::move(build_report()));或者如果我应该依靠(N)RVO来发生conststd::wstringreport(build_report());或什至将const引用绑定(bind)到临时用conststd::

c++ - 为什么在这里调用 move 构造函数?

这是一个C++测验的代码示例:#includestructX{X(constchar*){std::cout程序的输出是什么?我是这样想的:f(Xa)被调用,构造函数将constchar*隐式转换为X,所以输出为1由于我们没有对象来存储返回值,所以返回值被丢弃,没有输出g(constchar*)被调用,Xc(b)X(constchar*)输出是1返回值被丢弃一次-无输出所以答案是11。测验的答案是131。我用g++4.4.4-13得到的答案是121。据说这段代码是用这个命令编译的:g++-std=c++11-Wall-Wextra-O-pthread中间的数字从何而来?为什么它可以是3

c++ - 禁用复制和 move 语义的最简洁方法

以下方法确实有效,但非常乏味:T(constT&)=delete;T(T&&)=delete;T&operator=(constT&)=delete;T&operator=(T&&)=delete;我正在尝试发现最简洁的方法。以下是否可行?T&operator=(T)=delete;更新请注意,我选择T&operator=(T)而不是T&operator=(constT&)或T&operator=(T&&),因为它可以同时满足这两个目的。 最佳答案 根据这张图表(由HowardHinnant提供):最简洁的方式是=deletemov

c++ - 允许在一个完整表达式中 move 两次

假设一个函数具有以下原型(prototype)templatestd::unique_ptrprocess_object(std::unique_ptrptr);该函数可能返回(move版本)传递给它的对象,或完全不同的对象。如下使用这个函数,C++合法吗?std::unique_ptrpw(newWidget());pw=process_object(std::move(pw));如果我没记错的话,有一条C/C++规则禁止在单个完整表达式中多次修改对象。这条规则在这里适用吗?如果是的话,有什么方法可以在一行中以不同的方式表达这个成语吗?如果将std::unique_ptr替换为被鄙视

c++ - 在什么情况下我应该明确需要实现 move 构造函数和 move 赋值运算符?

鉴于一个类实际上是可move的,手动实现类的move构造函数和move赋值运算符很快就会变得乏味。我想知道什么时候这样做实际上是一个沉重、沉重、过早的优化?例如,如果一个类只有微不足道的POD数据或本身定义了move构造函数和move赋值运算符的成员,那么我猜编译器要么只是优化大量的垃圾(在POD),否则使用成员的move构造函数和move赋值运算符。但这能保证吗?在什么情况下我应该期望明确需要实现move构造函数和move赋值运算符?编辑:如下所述,NicolBolas在https://stackoverflow.com/a/9966105/6345对他的回答的评论中提到,在Visu