
Max
03.07.2018
10:17:15
Ты передаёшь ему аргументом свой тип, T.
Впрочем, всё равно странно.

Nikita
03.07.2018
10:22:58
странно что emplace_back на вектор при этом работает, то есть формально требования выполнены

Mikhail Voronov
03.07.2018
10:27:44

Google

Nikita
03.07.2018
10:28:40
gcc8.1 не компилит https://godbolt.org/g/J7cgbV
clang 6 тоже

Mikhail Voronov
03.07.2018
10:29:18
да, уже проверил, что странно

Nikita
03.07.2018
10:29:36
не знаю даже где спросить, на реддите?

yuri
03.07.2018
10:30:23
На реддите вспомнят про правило пяти.

Nikita
03.07.2018
10:31:23
Правило то понятно, непонятно почему функция требует ?

yuri
03.07.2018
10:35:42
А вот в этом месте b(a.begin(), a.end()); initializer list не создается?

Kitsu
03.07.2018
10:37:51

Nikita
03.07.2018
10:44:15

Grigor
03.07.2018
10:45:01
еще небось и мейлинг листов нет?

Дед Пегас
03.07.2018
10:45:21
В 40к все через псайкеров обшаются.

Nikita
03.07.2018
10:46:44

Google

Grigor
03.07.2018
10:46:58

Nikita
03.07.2018
10:47:18
Видимо да

Surreal
03.07.2018
10:47:23
> T must meet the requirements of MoveAssignable and MoveInsertable in order to use overload (4). required only if InputIt satisfies InputIterator but not ForwardIterator. (until C++17)

Nikita
03.07.2018
10:48:17

Surreal
03.07.2018
11:05:20
Передайте туда move_iterator
Как-то так: https://godbolt.org/g/ZAe6ex

Nikita
03.07.2018
11:09:43
Хмм, странное поведение, но я же не хочу move из другого вектора. Как видно в моем примере, если мы передаем итераторы в конструктор, то все работает, значит копировать он может, но почему-то не хочет

Surreal
03.07.2018
11:10:55
А как вы себе представляете move assignable без мува?

Nikita
03.07.2018
11:11:10
ну смотри
причем тут итератор
если требования на сам тип

Mikhail Voronov
03.07.2018
11:11:30
там муваются только внутренние элементы вектора при реаллокации

Nikita
03.07.2018
11:11:38
Ну да
Почему ему требуется копирование от T в insert но не требуется в конструкторе
Как бы и там и там копируются элементы из другого вектора
Вся разница в том что insert может еще внутри себя переаллоцировать внутреннее представление и замувать туда старые элементы

Mikhail Voronov
03.07.2018
11:18:13
Как-то так: https://godbolt.org/g/ZAe6ex
мне кажется, что тут дело в перегрузках, у clang в libc++ есть 2 функции:
vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last)
vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last)
первая вызывает вторую потом вот так
insert(__make_iter(__p), make_move_iterator(__v.begin()), make_move_iterator(__v.end()));

Kitsu
03.07.2018
11:21:23

Nikita
03.07.2018
11:21:52
Спросил у clang mailing list

Google

Nikita
03.07.2018
11:22:02
надеюсь ответят или перенаправят куда надо

Surreal
03.07.2018
11:30:21
туда = std::allocator_traits<A>::construct(m, p, rv);

yuri
03.07.2018
11:32:09
До move assignment не доходит, имхо. Вот в одном месте написано "It creates a vector of num elements, each element is created by calling copy-constructor of the class, passing instance as argument to it."

Constantine
03.07.2018
11:32:13
вакансии к алексу :)

Kateryna
03.07.2018
11:33:16

Nikita
03.07.2018
11:34:43
Насколько я понимаю что достаточно move_constructor или copy_constructor

Surreal
03.07.2018
11:37:30
Нужен переводчик с эльфийского.
@antoshkka

Antony
03.07.2018
11:38:46
Кто потревожил мой покой?

Дед Пегас
03.07.2018
11:40:21

Surreal
03.07.2018
11:40:45
Расскажите нам, пожалуйста, про конструктор std::vector, который принимает 2 итератора и про такой же insert при условии, что у нас non copy-assignable тип.
https://godbolt.org/g/7K7ZH7 почему данный пример требует copy assign для A? Если посмотреть на c++ reference https://en.cppreference.com/w/cpp/container/vector/insert то требуется только emplace constructable или я что-то не понимаю?

Constantine
03.07.2018
11:41:06

Nikita
03.07.2018
11:41:09
non copy-assignable*

Alexander
03.07.2018
11:41:59
хах

Nikita
03.07.2018
11:42:36
Но это же не то…

Antony
03.07.2018
11:43:13
Ага, смотрю. Пока ничего не понятно )

Alexander
03.07.2018
11:44:51
я пока что вангую на ошибку в cppreference
сейчас гляну в Стандарте что пишут

Google

Nikita
03.07.2018
11:46:29
Тут интересно еще если ошибка в cppreference почему у конструктора и у insert разные требования к типам

Alexander
03.07.2018
11:47:45
http://eel.is/c++draft/vector.modifiers
а ctor не должен

Nikita
03.07.2018
11:48:50
Он по идее должен мувать при реаллокации

Admin
ERROR: S client not available

Nikita
03.07.2018
11:49:20
Даже если копирует то почему через assignment

Alexander
03.07.2018
11:51:20
не вижу в стандарте требований к типу для разных перегрузок

Constantine
03.07.2018
11:52:51

Nikita
03.07.2018
11:53:50
Ну так вопрос в том почему?
Причем компилятору MSVC не нужен, но на него смотреть в планее соответствия стандарту не очень хочется

Surreal
03.07.2018
11:54:55
У него же появился флажок iso недавно.

Alexander
03.07.2018
11:55:44
начнём с того, что я не вижу в Стандарте требований, которые описывают то, что написано на CppReference
на eel draft не написано (или я не нахожу просто).

Mikhail Voronov
03.07.2018
11:57:17
https://godbolt.org/g/fTNZsh
причём, что самое интересное, оператор копирования реально может заиспользоваться в этом коде. При этом если будут move итераторы, то нет (т.е. у него нет asm body)

Constantine
03.07.2018
11:59:43

Nikita
03.07.2018
12:00:11

Alexander
03.07.2018
12:00:53
так, ещё раз - про какой мы говорим стандарт?

Constantine
03.07.2018
12:01:05

Google

Nikita
03.07.2018
12:01:13

Alexander
03.07.2018
12:01:18
найдите плиз в Стандарте и ткните меня носом, где написаны требования к типу у каждого std::vector::insert

Nikita
03.07.2018
12:01:21

Constantine
03.07.2018
12:01:33
Причем компилятору MSVC не нужен

Nikita
03.07.2018
12:01:45
не нужен Copy Assignment
хватает MoveAssignment
Все остальным нужен именно Copy Assignment
Пример вышел был

Constantine
03.07.2018
12:02:12
еще раз
требования MoveAssignment

Nikita
03.07.2018
12:02:27

Constantine
03.07.2018
12:02:38
но если вы даете то, что нельзя перемещать, как оно может это перемещать?
синтаксически это немедленно требование CopyAssignment

Nikita
03.07.2018
12:02:56
Я конкретно стандарт не смотрел, вопрос почему на cppreference написано так, а на самом деле не так

Alexander
03.07.2018
12:03:03
c++ 14
где написано в С++14 Стандарте, что у конкретно данной перегрузки std::vector::insert такие то требования к типу?

Nikita
03.07.2018
12:03:19