Перемещение не может быть эффективно реализовано (O (1)) на std :: array, поэтому почему он имеет конструктор перемещения?Должен ли std :: array иметь конструктор перемещения?
ответ
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
должен иметь конструктор шаг копирования, специально, так как он поставляется бесплатно. Не нужно требовать, чтобы он был активно отключен, и я не вижу в этом никакой пользы.
Требуется ли, чтобы конструктор перемещения элемента был 'nothrow'? Или он может просто покинуть операцию в любом законном состоянии? –
@MarkB хороший вопрос, я не думал об этом. Этот код работает так же, как и на gcc 4.7.3, даже если я добавлю конструктор копирования. Я должен буду прочитать стандарт, но я предполагаю, что переход от одного контейнера к другому не может ожидать поддержки надежной гарантии исключения. – juanchopanza
@juanchopanza: Я считаю, что вы правы в гарантии безопасности исключений. То есть, 'std :: array' move-constructor не обеспечивает надежную гарантию безопасности исключений. Только основной. См. Первую марку 12.8/15. Мое единственное сомнение заключается в том, что «соответствующий подобъект» также является значением r. Как вы думаете? –
Посмотри на стандарте: конструкторы
23.3.2.2 массива, копирование и присваивание [array.cons]
Условий для агрегата (8.5.1), должны быть выполнены. Класс array опирается на неявно объявленные специальные функции-члены (12.1, 12.4 и 12.8), чтобы соответствовать таблице требований к контейнеру в 23.2. В дополнение к требованиям, указанным в таблице требований к контейнеру, оператор неявного перемещения и назначение перемещения оператора для массива требуют, чтобы T был MoveConstructible или MoveAssignable, соответственно.
Конструктор перемещения и оператор присваивания, безусловно, не являются бесплатными, они не могут быть предоставлены.
Суммируя и расширить другие ответы, array<T>
должны быть подвижны (когда T
сам подвижны), потому что:
T
может быть эффективно подвижны.T
может быть перемещение только.
LOL, это ничего не говорит. «должен» «может» «может» ... по крайней мере, вы имеете в виду «должно» по стандарту? –
@ v.oddou Это говорит о том, почему факт, что 'array
@juanchopanza: это всего лишь письмо к Санта-Клаусу. это было уже очевидно до вопроса. да, мы хотим, что сказано. теперь мы хотим узнать ** факты ** о том, есть это или нет, и почему. –
- 1. Имеет ли смысл конструктор перемещения constexpr?
- 2. Должен ли bean иметь конструктор по умолчанию?
- 3. Должен ли завод иметь конструктор с параметрами?
- 4. (Почему) должен ли конструктор перемещения или оператор переноса перемещения очистить свой аргумент?
- 5. Конструктор должен иметь указанный параметр
- 6. Как проверить, создается ли конструктор перемещения неявно?
- 7. Имеет ли D конструктор перемещения?
- 8. Должен ли std :: function :: operator bool возвращать false после перемещения?
- 9. Должен ли я std :: переместить shared_ptr в конструкторе перемещения?
- 10. Должен ли я иметь конструктор в производном классе?
- 11. Должен ли всегда иметь конструктор с нулевым аргументом в классе?
- 12. Удостоверяясь конструктор перемещения вызывается
- 13. std :: stringstream должен иметь dll-интерфейс
- 14. Почему не вызвал конструктор перемещения?
- 15. Является ли частный конструктор перемещения для предотвращения перемещения?
- 16. Как конструктор перемещения переменной-члена вызывается без использования std :: forward?
- 17. Зачем использовать конструктор перемещения?
- 18. Изменение размера на std :: vector не вызывает конструктор перемещения
- 19. Должен ли я удалить конструктор перемещения и назначение перемещения умного указателя?
- 20. Как работает конструктор перемещения?
- 21. Когда конструктор перемещения вызван
- 22. Почему здесь называется конструктор перемещения?
- 23. Почему следующий код не вызывает конструктор перемещения std :: string?
- 24. C++ Должен ли я всегда использовать std :: move для вызова конструктора перемещения?
- 25. Должен ли класс NPC иметь собственную функцию перемещения или функция перемещения принадлежит классу игры?
- 26. Как правильно определить конструктор перемещения?
- 27. Создан ли конструктор перемещения по умолчанию?
- 28. Поддерживает ли поддерживающий протокол буферов конструктор перемещения
- 29. Является ли конструктор перемещения дважды называемым C++?
- 30. Является ли размер std :: array определенным стандартом
'std :: array' не имеет * any * конструкторов, кроме значений по умолчанию, сгенерированных компилятором. – Casey
Откуда у вас эта неправильная информация (что 'std :: array' имеет конструктор перемещения)? –
@ R.MartinhoFernandes созданный компилятором конструктор перемещения. – Walter