
Nikita
03.07.2018
12:03:53

Серж
03.07.2018
12:07:20
неудивительно что специалисты джаваскрипта лучше оплачиваются, пока вы выясните что надо, чтобы в динамический массив элемент положить, на джаваскрипте можно три фреймворка написать

Constantine
03.07.2018
12:07:28

Google

Constantine
03.07.2018
12:08:02
стандартный swap требует MoveAssignment

Surreal
03.07.2018
12:08:48
Вот непонятно, почему все не могут так реализовать. Получается, что есть все необходимое, но из-за реализации внутри билиотеки оно не работает.

Nikita
03.07.2018
12:09:08

Alexander
03.07.2018
12:09:37
http://eel.is/c++draft/sequence.reqmts

Nikita
03.07.2018
12:10:35

Alexander
03.07.2018
12:10:44
я сейчас сделаю
a.insert(p,i,j) iterator
Requires: T shall be Cpp17EmplaceConstructible into X from *i. For vector and deque, T shall also be Cpp17MoveInsertable into X, Cpp17MoveConstructible, Cpp17MoveAssignable, and swappable ([swappable.requirements]). Each iterator in the range [i, j) shall be dereferenced exactly once.
Requires: i and j are not iterators into a.
Inserts copies of elements in [i, j) before p

Nikita
03.07.2018
12:11:27
Просто тут либо один из компиляторов не соответствует стандарту, либо cppreference врет

Surreal
03.07.2018
12:12:17
Можно попробовать еще свой swap специализировать тогда, мб заведется.

Alexander
03.07.2018
12:12:52
может там какие-то действительно спец. требования, чтобы быть swappable?
http://eel.is/c++draft/swappable.requirements

Nikita
03.07.2018
12:15:04
Насколько я понял что swappable значит что внезапно можно вызвать swap и он действительно свапнет
А вот какие требования у swap в стандарте написано?

Google

Alexander
03.07.2018
12:18:33
http://eel.is/c++draft/utility#swap

Nikita
03.07.2018
12:19:08
Requires: Type T shall be Cpp17MoveConstructible (Table 25) and Cpp17MoveAssignable (Table 27).
yep
про копирование ни слова

Antony
03.07.2018
12:30:13
Про копирование есть выше: Requires: T shall be CopyInsertable into X
and CopyAssignable.
но там про другой метод. Кажется что GCC не прав и реализоввывают через assignment вместо unitialized move

Nikita
03.07.2018
12:31:06

Antony
03.07.2018
12:33:11
a.insert(p,n,t)
iterator
Requires: T shall be Cpp17CopyInsertable into X and Cpp17CopyAssignable.

Nikita
03.07.2018
12:33:52
Но это же другая перегрузка
которая n элементов t

Alexander
03.07.2018
12:34:50

Constantine
03.07.2018
12:35:39
@antoshkka тут действительно забавная фигня, я не знаю, как называется требование, но, видимо, нужно указать, что выражение result = *iterator все-таки валидно

Alexander
03.07.2018
12:36:19
CopyIteratorAssignable? ?
я где-то не так давно такое требование, только не вспомню, как оно назвается

Antony
03.07.2018
12:37:31

Constantine
03.07.2018
12:37:56

Antony
03.07.2018
12:39:32
Ну да, либо через swap, либо через uninitialized_move/copy

Constantine
03.07.2018
12:39:57
а вращение вот так:
123 45678
321 87654
45678 123
тремя реверсами)


Antony
03.07.2018
12:41:44
GCC вот тут юзает std::copy. От него то и проблемы
vector<_Tp, _Alloc>::
_M_range_insert(iterator __position, _ForwardIterator __first,
_ForwardIterator __last, std::forward_iterator_tag)
{
if (__first != __last)
{
const size_type __n = std::distance(__first, __last);
if (size_type(this->_M_impl._M_end_of_storage
- this->_M_impl._M_finish) >= __n)
{
const size_type __elems_after = end() - __position;
pointer __old_finish(this->_M_impl._M_finish);
if (__elems_after > __n)
{
std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __n;
_GLIBCXX_MOVE_BACKWARD3(__position.base(),
__old_finish - __n, __old_finish);
std::copy(__first, __last, __position);
}
else
{
_ForwardIterator __mid = __first;
std::advance(__mid, __elems_after);
std::__uninitialized_copy_a(__mid, __last,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __n - __elems_after;
std::__uninitialized_move_a(__position.base(),
__old_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __elems_after;
std::copy(__first, __mid, __position);
}
}
else


Constantine
03.07.2018
12:41:58
GCC вот тут юзает std::copy. От него то и проблемы
vector<_Tp, _Alloc>::
_M_range_insert(iterator __position, _ForwardIterator __first,
_ForwardIterator __last, std::forward_iterator_tag)
{
if (__first != __last)
{
const size_type __n = std::distance(__first, __last);
if (size_type(this->_M_impl._M_end_of_storage
- this->_M_impl._M_finish) >= __n)
{
const size_type __elems_after = end() - __position;
pointer __old_finish(this->_M_impl._M_finish);
if (__elems_after > __n)
{
std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __n;
_GLIBCXX_MOVE_BACKWARD3(__position.base(),
__old_finish - __n, __old_finish);
std::copy(__first, __last, __position);
}
else
{
_ForwardIterator __mid = __first;
std::advance(__mid, __elems_after);
std::__uninitialized_copy_a(__mid, __last,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __n - __elems_after;
std::__uninitialized_move_a(__position.base(),
__old_finish,
this->_M_impl._M_finish,
_M_get_Tp_allocator());
this->_M_impl._M_finish += __elems_after;
std::copy(__first, __mid, __position);
}
}
else
clang тоже юзает в одной из веток

Google

Antony
03.07.2018
12:42:27
Засада в том, что если реализоввывать не через Copy, тогда получим просадку по перфу - придётся либо вызывать деструкторы, либо свапать

Constantine
03.07.2018
12:42:40
тут можно поставить deinitialize и emplace ctor, вопрос только что скорее надо стандарт в этом месте поправить
требование copyctor без copyassign это все-таки серьезное извращение

Antony
03.07.2018
12:44:16
Не, со стандартом там все ОК. Требования Cpp17EmplaceConstructible, Cpp17MoveConstructible, Cpp17MoveAssignable как раз об этом и говорят

Surreal
03.07.2018
12:44:45
Надо еще специализацию для move итераторов посмотреть, с ней все нормально работает.
Жаль, что на godbolt.org нельзя по исходникам ходить.

Constantine
03.07.2018
12:50:57

Antony
03.07.2018
12:53:10

Nikita
03.07.2018
12:53:46
Хорошо оставить как fallback если тип копируемый
А то сейчас получается что стандарту не соответствует

Constantine
03.07.2018
12:54:46
ага, кажется что будет пошустрее
Угу. Вот представьте, что в текущей реализации типа gcc/clang мы заменим copy на destroy + uninitilized_copy и там vector<vector<int» с типичным внутренним размером 16, привет деаллокации с последующими аллокациями памяти.
И этим платим за то, что пользователь универсальную реализацию CopyAssignment через swap with copy не хочет писать

Surreal
03.07.2018
14:12:42

Surreal
03.07.2018
14:16:35
btw позабавило количество различных вариантов *_copy_* в libstdc++:
__copy_move
__copy_m
__copy_move_a
__copy_move_a2
Это только те, которые относятся к std::copy, там такие наборы еще для backward и т.д.

Max
03.07.2018
16:29:08
Куда можно писать пропосалы? Хочу излить свою боль. Я хочу, чтоб алгоритмы из algorithms умели принимать Container, а не пару итераторов. Под конец дня у меня от этого бессмысленного и беспощадного бройлерплейта на всю ширину экрана уже глаз дёргаться начинает.

Alexander
03.07.2018
16:30:17

Anton
03.07.2018
16:30:46
Всего через 2 годика)

Никита
03.07.2018
16:33:24
И будет так же передавать пару итераторов, только теперь не в алгоритм, а в конструктор диапазона

Alexander
03.07.2018
16:43:50
посмотрите, как сделано в Boost.Algorithm

Igor
03.07.2018
16:51:39
"Бройлерплейт" это метко сказано, надо запомнить

Denis
03.07.2018
17:23:22
не могу понять как сделать перегрузку структуры или констэкспр функции на базе того, существует ли тип или нет. Например, у меня есть некий тип Container<Args...>, хочется чтобы, если есть Container<Args...>::value_type, то вызвать эту же структруру/функцию для него, иначе sizeof...(Args).
Короче этакий подсчет количества дырок в контейнере, без учета всяких аллокаторов (которые в тот же вектор вторым тайп-параметром передаются)

Google

Surreal
03.07.2018
17:26:37
enable_if?
+detection idiom

Denis
03.07.2018
17:27:49
enable_if говорит что нет такого типа для тех контейнеров, где его нет

Серж
03.07.2018
17:28:03
Sfinae)))

Denis
03.07.2018
17:28:54
не могу пока доехать как. decltype(value_type(), int()) тоже ругается при наличии рядом перегрузки с параметром более базового типа и без такой проверки
есть подозрение что потому что оно констэкспр

Admin
ERROR: S client not available

Surreal
03.07.2018
17:30:16
А можно какой-нибудь минимальный пример?

Denis
03.07.2018
17:30:50
ща попробую перенести. Я прост пишу с личного ноута, код весь на рабочем компе (я туда телегу не ставлю)
вот оно как раз говорит что no type named value_type для контейнеров, где нет такого типа

Ilia
03.07.2018
18:04:45

Surreal
03.07.2018
19:21:03

Denis
03.07.2018
19:25:40
Если правильно понял, чего вы хотите добиться, то: https://godbolt.org/g/ykbGED
С телефона не оч читабельно, но ты вроде там считаешь внутренний тип и только для контейнеров с велью тайп. Моя идея в том, что у меня есть как с велью тайп (стд, где у вектора это сам тип, у мапы - пара), так и контейнеры без велью тайп (qmap). Для вторых я хочу считать через сайзоф. Для первых так нельзя из-за доп тайп параметра у стд контейнеров для аллокатора. Но у них можно считать по велью тайп (считая 0 за 1)

Surreal
03.07.2018
19:28:24
А, ну не суть, там можно подправить так, как вам будет нужно.
Детектор для value_type std контейнеров там есть, остальное на ваше усмотрение.

Denis
03.07.2018
19:29:43

Владислав
03.07.2018
19:32:15
Господа можете помочь как в visual studio начать выполнекние програмы по действиям(f10) с определёногоместа?

Surreal
03.07.2018
19:35:07

Google

Surreal
03.07.2018
19:35:21

Владислав
03.07.2018
19:55:13
а как это сделать?

Surreal
03.07.2018
19:56:40

Владислав
03.07.2018
19:56:47
спасибо

Дед Пегас
04.07.2018
08:50:25
Сразу скажу: вакансии в отдельный канал, пожалйуста, через @AlexFails

Roman
04.07.2018
09:06:49
Вопрос по порядку инициализации глобальных переменных и константных static членов класса.
Я так понимаю, что порядок их инициализации не определен в рамках разных единиц трансляции.
Но если их инициализация написана в одном cpp файле, то они и инициализироваться будут по порядку их объявления?

Ilia
04.07.2018
09:11:57

Anatoly
04.07.2018
09:22:00

Roman
04.07.2018
09:22:07
просто статические члены класса вроде как должны быть обязательно объявлены в *.cpp

Ilia
04.07.2018
09:22:39

Anatoly
04.07.2018
09:22:49

Ilia
04.07.2018
09:22:54

Roman
04.07.2018
09:23:35
спасибо!

Ilia
04.07.2018
09:27:10