@ProCxx

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

Впрочем, всё равно странно.

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

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
беда, а нет посовременнее каналов связи?
у вас там в 3k20 что-то лучше изобрели?

еще небось и мейлинг листов нет?

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

Nikita
03.07.2018
10:46:44
у вас там в 3k20 что-то лучше изобрели?
Современнее не значит лучше, просто не использую ирку уже давно и начинать не хотелось бы

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

Surreal
03.07.2018
10:47:23
в данном случае берется перегрузка 4
> This overload only participates in overload resolution if InputIt qualifies as InputIterator, to avoid ambiguity with the overload (3).

> 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)

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
Почему ему требуется копирование от T в insert но не требуется в конструкторе
Для конструктора вообще особо трейтов не указано, а вот для insert в MoveInsertable есть требование на T, что туда аргументом передается rvalue.

туда = 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 или я что-то не понимаю?

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

Alexander
03.07.2018
11:41:59
non copy-assignable*
тебе там в mailing list советуют make_move_iterator ?

хах

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
Ну так вопрос в том почему?
Потому что insert должен как минимум уметь swap выполнять, а это MoveAssignment

Nikita
03.07.2018
12:00:11
Откуда информация?
О том что нужен, или несоответсвии стандарту?

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

Constantine
03.07.2018
12:01:05
О том что нужен, или несоответсвии стандарту?
О том, что не нужен. Я не представляю, как реализовать insert с парой итераторов без MoveAssignment

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

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

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
требования MoveAssignment
Оно выполнено

Страница 2173 из 2477