簡體   English   中英

應該std :: array有移動構造函數?

[英]Should std::array have move constructor?

移動不能在std :: array上有效地實現(O(1)),那么為什么它具有move構造函數?

std::array具有由編譯器生成的move構造函數,該構造函數允許將一個實例的所有元素移入另一個實例。 如果元素可以有效移動或僅可移動,則這很方便:

#include <array>
#include <iostream>

struct Foo
{
  Foo()=default;
  Foo(Foo&&)
  {
    std::cout << "Foo(Foo&&)\n";
  }
  Foo& operator=(Foo&&)
  {
    std::cout << "operator=(Foo&&)\n";
    return *this;
  }
};

int main()
{
  std::array<Foo, 10> a;
  std::array<Foo, 10> b = std::move(a);
}

所以我要說std::array應該有一個移動拷貝構造函數,特別是因為它是免費提供的。 沒有人會要求將其主動禁用,我看不到有任何好處。

總結和擴展其他答案, array<T>應該是可移動的(當T本身可移動時),因為:

  • T可以有效地移動。
  • T可能是移動的。

看一下標准:

23.3.2.2數組構造函數,復制和賦值[array.cons]

骨料(8.5.1)的條件應得到滿足。 類數組依賴於隱式聲明的特殊成員函數(12.1、12.4和12.8),以符合23.2中的容器要求表。 除了在容器需求表中指定的需求外,數組的隱式移動構造函數和移動賦值運算符還要求T分別為MoveConstructible或MoveAssignable。

到目前為止,move構造函數和賦值運算符不是免費的,可能不會提供。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM