草庐IT

move-constructor

全部标签

c++ - 为什么移动构造函数需要其成员的默认构造函数?

我试图为没有复制构造函数的类实现移动构造函数。我收到一个错误,提示该类成员的默认构造函数丢失。这里有一个简单的例子来说明这一点:structA{public:A()=delete;A(Aconst&)=delete;A(A&&a){}};structB{Aa;B()=delete;B(Bconst&)=delete;B(B&&b){}};试图编译这个,我得到:move_without_default.cc:Inconstructor‘B::B(B&&)’:move_without_default.cc:15:11:error:useofdeletedfunction‘A::A()’B(

c++ - 为什么移动构造函数需要其成员的默认构造函数?

我试图为没有复制构造函数的类实现移动构造函数。我收到一个错误,提示该类成员的默认构造函数丢失。这里有一个简单的例子来说明这一点:structA{public:A()=delete;A(Aconst&)=delete;A(A&&a){}};structB{Aa;B()=delete;B(Bconst&)=delete;B(B&&b){}};试图编译这个,我得到:move_without_default.cc:Inconstructor‘B::B(B&&)’:move_without_default.cc:15:11:error:useofdeletedfunction‘A::A()’B(

c++ - `pair::operator=(pair&&)` 错误与 `auto&` 推断 move 操作 - libstdc++ 回归?

鉴于这个程序:structVal{Val()=default;Val(Val&&)=default;auto&operator=(Val&&);};/*PLACEHOLDER*/auto&Val::operator=(Val&&){return*this;}替换/*PLACEHOLDER*/与...intmain(){std::vector>v;v.emplace(std::begin(v),0,Val{});}...编译成功:g++6.2.0g++6.3.0g++7.0.1(主干)clang++3.9.1clang++5.0.0(HEAD)onwandbox替换/*PLACEHOLD

c++ - `pair::operator=(pair&&)` 错误与 `auto&` 推断 move 操作 - libstdc++ 回归?

鉴于这个程序:structVal{Val()=default;Val(Val&&)=default;auto&operator=(Val&&);};/*PLACEHOLDER*/auto&Val::operator=(Val&&){return*this;}替换/*PLACEHOLDER*/与...intmain(){std::vector>v;v.emplace(std::begin(v),0,Val{});}...编译成功:g++6.2.0g++6.3.0g++7.0.1(主干)clang++3.9.1clang++5.0.0(HEAD)onwandbox替换/*PLACEHOLD

c++ - 为什么在返回从函数的返回类型派生的类型的本地对象时不选择 move 构造函数?

以下代码均被Clang拒绝和GCC(主干版本):#includestructBase{Base()=default;Base(Baseconst&)=delete;Base(Base&&)=default;};structDerived:Base{Derived()=default;Derived(Derivedconst&)=delete;Derived(Derived&&)=default;};autofoo()->Base{Derivedd;returnd;//ERRORHERE}导致以下错误:prog.cc:Infunction'Basefoo()':prog.cc:21:12

c++ - 为什么在返回从函数的返回类型派生的类型的本地对象时不选择 move 构造函数?

以下代码均被Clang拒绝和GCC(主干版本):#includestructBase{Base()=default;Base(Baseconst&)=delete;Base(Base&&)=default;};structDerived:Base{Derived()=default;Derived(Derivedconst&)=delete;Derived(Derived&&)=default;};autofoo()->Base{Derivedd;returnd;//ERRORHERE}导致以下错误:prog.cc:Infunction'Basefoo()':prog.cc:21:12

c++ - move std::vector 时是否需要保留容量?

考虑以下代码:std::vectorvec;vec.reserve(500);size_tcap=vec.capacity();std::vectornewVec=std::move(vec);assert(cap==newVec.capacity());在您遇到的几乎任何实现中,这都会起作用。我不在乎实现是做什么的。我想知道标准需要什么。move到vector的容量是否与原始容量相同?还是断言会触发? 最佳答案 从标准来看,move构造函数似乎不需要任何东西,但是正如@amaurea所说,如果move构造函数尝试分配或释放内存,它

c++ - move std::vector 时是否需要保留容量?

考虑以下代码:std::vectorvec;vec.reserve(500);size_tcap=vec.capacity();std::vectornewVec=std::move(vec);assert(cap==newVec.capacity());在您遇到的几乎任何实现中,这都会起作用。我不在乎实现是做什么的。我想知道标准需要什么。move到vector的容量是否与原始容量相同?还是断言会触发? 最佳答案 从标准来看,move构造函数似乎不需要任何东西,但是正如@amaurea所说,如果move构造函数尝试分配或释放内存,它

c++ - return 语句何时需要显式 move ?

在commenttoanotherquestion中JonathanWakely回应我的声明:Youneverneedexplicitmoveforalocalvariablefunctionreturnvalue.It'simplicitmovethere->...neversaynever...Youneedanexplicitmoveifthelocalvariableisnotthesametypeasthereturntype,e.g.std::unique_ptrf(){autop=std::make_unique();p->foo();returnp;},butifthe

c++ - return 语句何时需要显式 move ?

在commenttoanotherquestion中JonathanWakely回应我的声明:Youneverneedexplicitmoveforalocalvariablefunctionreturnvalue.It'simplicitmovethere->...neversaynever...Youneedanexplicitmoveifthelocalvariableisnotthesametypeasthereturntype,e.g.std::unique_ptrf(){autop=std::make_unique();p->foo();returnp;},butifthe