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> со списком инициализации? (без предоставления конструктора копирования)
Для следующего класса только с конструктором перемещения: [code]class Foo { public: Foo(const Foo& foo) = delete; Foo(Foo&& foo) = default; Foo() = default; }; [/code] Почему инициализация вектора с помощью списка инициализации, такого как вектор vec{Foo()};, приведет к ошибке компиляции: [code]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 [/code] Хотя проблем не возникнет, если я инициализирую массив так же, как array arr{Foo()};.. p> Я хотел бы знать: [list] [*]Что на самом деле означает это сообщение об ошибке: я искал использование is_constructible , и похоже, что он проверяет, можете ли вы создать объект с определенными параметрами. Тогда какие параметры вектор пытается проверить для типа Foo? [*]Почему такое поведение для вектора и массива отличается? [*]Каков внутренний процесс при построении вектора следующим образом: я думал, что это будет то же самое, что вызов .push_back с переданным значением rvalue, чтобы можно было вызвать конструктор перемещения, и он не вызывал ошибок. [*]Можно ли внести некоторые изменения в класс Foo, чтобы он работал при построении вектора< /code> со списком инициализации? (без предоставления конструктора копирования) [/list]
Для следующего класса только с конструктором перемещения:
class Foo {
public:
Foo(const Foo& foo) = delete;
Foo(Foo&& foo) = default;
Foo() = default;
};
Почему инициализация вектора с помощью списка инициализации, такого как вектор vec{Foo()};,...
Скажите, пожалуйста, как мне исправить этот фрагмент кода, чтобы класс cookie_name_t не использовал конструктор копирования и конструктор присваивания.
Когда я делаю следующее:
cookie_name(cookie_name const &) = delete;
cookie_name...
Я реализовал две версии решения для следующей задачи LeetCode:
🔗 максимальные и минимальные суммы при последующих размерах k
Учитывая целочисленные массивы nums и положительное целое число k , верните сумму максимальных и минимальных элементов...
Я реализовал две версии решения для следующей задачи LeetCode:
🔗 максимальные и минимальные суммы при последующих размерах k
Учитывая целочисленные массивы nums и положительное целое число k , верните сумму максимальных и минимальных элементов...