Подтвердить что ты не робот

Должен ли std:: array иметь конструктор перемещения?

Перемещение не может быть эффективно реализовано (O (1)) в std:: array, поэтому почему он имеет конструктор перемещения?

4b9b3361

Ответ 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, соответственно.

Конструктор перемещения и оператор присваивания, безусловно, не являются свободными, они могут не предоставляться.