第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

向量增長(zhǎng)時(shí)如何執(zhí)行移動(dòng)語(yǔ)義?

向量增長(zhǎng)時(shí)如何執(zhí)行移動(dòng)語(yǔ)義?

C++
一只斗牛犬 2019-06-21 12:31:10
向量增長(zhǎng)時(shí)如何執(zhí)行移動(dòng)語(yǔ)義?我有一個(gè)std::vector某一類物體的A..該類具有非平凡性,并具有副本構(gòu)造函數(shù)。和定義移動(dòng)構(gòu)造函數(shù)。std::vector<A>  myvec;如果我用A對(duì)象(使用例如:myvec.push_back(a)),使用復(fù)制構(gòu)造函數(shù),向量的大小將增加。A( const A&)實(shí)例化向量中元素的新副本。我能以某種方式強(qiáng)制執(zhí)行類的移動(dòng)構(gòu)造函數(shù)嗎?A是不是用了?
查看完整描述

3 回答

?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊

您需要通知C+(特別是std::vector)移動(dòng)構(gòu)造函數(shù)和析構(gòu)函數(shù)不會(huì)引發(fā)noexcept..然后,當(dāng)向量增長(zhǎng)時(shí),將調(diào)用Move構(gòu)造函數(shù)。

這是如何聲明和實(shí)現(xiàn)移動(dòng)構(gòu)造器,這是std::vector:

A(A && rhs) noexcept { 
  std::cout << "i am the move constr" <<std::endl;
  ... some code doing the move ...  
  m_value=std::move(rhs.m_value) ; // etc...
}

如果構(gòu)造函數(shù)不是noexceptstd::vector不能使用它,因?yàn)樗荒鼙WC標(biāo)準(zhǔn)所要求的異常保證。

有關(guān)標(biāo)準(zhǔn)中所述內(nèi)容的更多信息,請(qǐng)閱讀C+移動(dòng)語(yǔ)義和異常

這歸功于薄,他暗示這可能與例外有關(guān)。還可以考慮克雷克的建議和使用emplace_back如果可能的話。它能,會(huì),可以更快(但通常不是),它可以更清晰和更緊湊,但也有一些缺陷(特別是對(duì)非顯式構(gòu)造函數(shù))。

編輯通常默認(rèn)情況是您想要的:移動(dòng)所有可以移動(dòng)的東西,復(fù)制其余的。要明確地要求這樣做,請(qǐng)寫(xiě)

A(A && rhs) = default;

這樣做,你會(huì)得到不,除非有可能:默認(rèn)的移動(dòng)構(gòu)造函數(shù)是否定義為no以外?

請(qǐng)注意,VisualStudio 2015及更高版本的早期版本不支持這一點(diǎn),盡管它支持移動(dòng)語(yǔ)義。


查看完整回答
反對(duì) 回復(fù) 2019-06-21
?
Cats萌萌

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊

有趣的是,GCC 4.7.2的向量只在移動(dòng)構(gòu)造函數(shù)和析構(gòu)函數(shù)都是noexcept..一個(gè)簡(jiǎn)單的例子:

struct foo {
    foo() {}
    foo( const foo & ) noexcept { std::cout << "copy\n"; }
    foo( foo && ) noexcept { std::cout << "move\n"; }
    ~foo() noexcept {}
};

int main() {
    std::vector< foo > v;
    for ( int i = 0; i < 3; ++i ) v.emplace_back();
}

這將產(chǎn)生預(yù)期的結(jié)果:

move
move
move

但是,當(dāng)我移除noexcept從…~foo(),結(jié)果是不同的:

copy
copy
copy

我想這也是這個(gè)問(wèn)題.


查看完整回答
反對(duì) 回復(fù) 2019-06-21
?
慕勒3428872

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊

似乎,(對(duì)于C+17和早期)強(qiáng)制執(zhí)行的唯一方法是std::vector使用移動(dòng)語(yǔ)義重新分配是刪除復(fù)制構(gòu)造函數(shù):)。以這種方式,它將在編譯時(shí)使用移動(dòng)構(gòu)造函數(shù)或嘗試死亡:)。

有很多規(guī)則std::vector不能在重新分配時(shí)使用移動(dòng)構(gòu)造函數(shù),但不能使用移動(dòng)構(gòu)造函數(shù)的位置。必須使用它。

template<class T>
class move_only : public T{
public:
   move_only(){}
   move_only(const move_only&) = delete;
   move_only(move_only&&) noexcept {};
   ~move_only() noexcept {};

   using T::T;   
};

生活,居住

template<class T>
struct move_only{
   T value;

   template<class Arg, class ...Args, typename = std::enable_if_t<
            !std::is_same_v<move_only<T>&&, Arg >
            && !std::is_same_v<const move_only<T>&, Arg >
    >>
   move_only(Arg&& arg, Args&&... args)
      :value(std::forward<Arg>(arg), std::forward<Args>(args)...)
   {}

   move_only(){}
   move_only(const move_only&) = delete;   
   move_only(move_only&& other) noexcept : value(std::move(other.value)) {};    
   ~move_only() noexcept {};   
};

活碼

你的T類必須noexcept移動(dòng)構(gòu)造函數(shù)/輔助操作符和noexcept破壞者。否則,您將得到編譯錯(cuò)誤。

std::vector<move_only<MyClass>> vec;


查看完整回答
反對(duì) 回復(fù) 2019-06-21
  • 3 回答
  • 0 關(guān)注
  • 491 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)