[英]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.