Перемещение не может быть эффективно реализовано (O (1)) в std:: array, поэтому почему он имеет конструктор перемещения?
Должен ли std:: array иметь конструктор перемещения?
Ответ 1
std::array
имеет созданный компилятором конструктор перемещения, который позволяет перемещать все элементы одного экземпляра в другой. Это удобно, если элементы эффективно перемещаются или если они только подвижны:
#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
должен иметь конструктор копии перемещения, особенно потому, что он поставляется бесплатно. Не нужно требовать, чтобы он был активно отключен, и я не вижу в этом никакой пользы.
Ответ 2
Чтобы обобщить и расширить другие ответы, array<T>
должен быть подвижным (когда T
сам является подвижным), потому что:
-
T
может быть эффективно перемещаемым. -
T
может быть только для перемещения.
Ответ 3
Посмотрите на стандарт:
23.3.2.2 конструкторы массивов, копирование и назначение [array.cons]
Условия для агрегата (8.5.1) должны выполняться. Класс массива опирается на неявно объявленные специальные функции-члены (12.1, 12.4 и 12.8), чтобы соответствовать таблице требований к контейнерам в 23.2. В дополнение к требованиям, указанным в таблице требований к контейнеру, неявный механизм перемещения и назначение перемещения оператор для массива требует, чтобы T был MoveConstructible или MoveAssignable, соответственно.
Конструктор перемещения и оператор присваивания, безусловно, не являются свободными, они могут не предоставляться.