Инициализация вектора и массива с инициализацией списка объектов, у которых есть только конструктор перемещенияC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Инициализация вектора и массива с инициализацией списка объектов, у которых есть только конструктор перемещения

Сообщение Anonymous »

Для следующего класса только с конструктором перемещения:

Код: Выделить всё

class Foo {
public:
Foo(const Foo& foo) = delete;
Foo(Foo&& foo) = default;
Foo() = default;
};
Почему инициализация вектора с помощью списка инициализации, такого как вектор vec{Foo()};, приведет к ошибке компиляции:

Код: Выделить всё

In file included from /usr/include/c++/11/vector:66,
from test_rand.cpp:3:
/usr/include/c++/11/bits/stl_uninitialized.h: In instantiation of ‘_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const Foo*; _ForwardIterator = Foo*]’:
/usr/include/c++/11/bits/stl_uninitialized.h:333:37:   required from ‘_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator&) [with _InputIterator = const Foo*; _ForwardIterator = Foo*; _Tp = Foo]’
/usr/include/c++/11/bits/stl_vector.h:1585:33:   required from ‘void std::vector::_M_range_initialize(_ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator = const Foo*; _Tp = Foo; _Alloc = std::allocator]’
/usr/include/c++/11/bits/stl_vector.h:629:21:   required from ‘std::vector::vector(std::initializer_list, const allocator_type&) [with _Tp = Foo; _Alloc = std::allocator; std::vector::allocator_type = std::allocator]’
test_rand.cpp:13:23:   required from here
/usr/include/c++/11/bits/stl_uninitialized.h:138:72: error: static assertion failed: result type must be constructible from value type of input range
138 |       static_assert(is_constructible::value,
|                                                                        ^~~~~
/usr/include/c++/11/bits/stl_uninitialized.h:138:72: note: ‘std::integral_constant::value’ evaluates to false
Хотя проблем не возникнет, если я инициализирую массив так же, как array arr{Foo()};.. p>
Я хотел бы знать:
  • Что на самом деле означает это сообщение об ошибке: я искал использование is_constructible , и похоже, что он проверяет, можете ли вы создать объект с определенными параметрами. Тогда какие параметры вектор пытается проверить для типа Foo?
  • Почему такое поведение для вектора и массива отличается?
  • Каков внутренний процесс при построении вектора следующим образом: я думал, что это будет то же самое, что вызов .push_back с переданным значением rvalue, чтобы можно было вызвать конструктор перемещения, и он не вызывал ошибок.
  • Можно ли внести некоторые изменения в класс Foo, чтобы он работал при построении вектора< /code> со списком инициализации? (без предоставления конструктора копирования)


Подробнее здесь: https://stackoverflow.com/questions/787 ... nly-have-m
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»