亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

向量增長時如何執行移動語義?

向量增長時如何執行移動語義?

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

3 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

您需要通知C+(特別是std::vector)移動構造函數和析構函數不會引發noexcept..然后,當向量增長時,將調用Move構造函數。

這是如何聲明和實現移動構造器,這是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...
}

如果構造函數不是noexceptstd::vector不能使用它,因為它不能保證標準所要求的異常保證。

有關標準中所述內容的更多信息,請閱讀C+移動語義和異常

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

編輯通常默認情況是您想要的:移動所有可以移動的東西,復制其余的。要明確地要求這樣做,請寫

A(A && rhs) = default;

這樣做,你會得到不,除非有可能:默認的移動構造函數是否定義為no以外?

請注意,VisualStudio 2015及更高版本的早期版本不支持這一點,盡管它支持移動語義。


查看完整回答
反對 回復 2019-06-21
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

有趣的是,GCC 4.7.2的向量只在移動構造函數和析構函數都是noexcept..一個簡單的例子:

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();
}

這將產生預期的結果:

move
move
move

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

copy
copy
copy

我想這也是這個問題.


查看完整回答
反對 回復 2019-06-21
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

似乎,(對于C+17和早期)強制執行的唯一方法是std::vector使用移動語義重新分配是刪除復制構造函數:)。以這種方式,它將在編譯時使用移動構造函數或嘗試死亡:)。

有很多規則std::vector不能在重新分配時使用移動構造函數,但不能使用移動構造函數的位置。必須使用它。

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移動構造函數/輔助操作符和noexcept破壞者。否則,您將得到編譯錯誤。

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


查看完整回答
反對 回復 2019-06-21
  • 3 回答
  • 0 關注
  • 502 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號