
Dmitry
05.09.2018
07:56:25
foo(->x);
use(x); // compile error, x not defined
if(condition) foo (->y);
use(y); // UB if condition

Igor
05.09.2018
08:10:43
господа, меня тут чуть-чуть перемкнуло - класть -1 в uin64_t это же numeric_limits<uint64_t>::max, а не UB которое по счастливому стечению все компиляторы реализуют одинаково?

Spoonson
05.09.2018
08:12:48

Yarique
05.09.2018
08:12:52

Google

Yarique
05.09.2018
08:13:14
Из-за программирования микроконтроллеров
Так можно короч

Igor
05.09.2018
08:14:15
> unsigned int overflow
тьфу чёрт, вот как это называлось, а я загуглить не мог нормально) только underflow, порядка ради
спасибо

Spoonson
05.09.2018
08:14:38
ток это не overflow, а conversion
нет?

Igor
05.09.2018
08:15:07
> The correct reference is §6.3.1.3 (signed and unsigned integer conversion)
даже conversion, да

Sergey
05.09.2018
08:15:11
Народ посоветуйте как выучить английский язык чтоб мог читать английскую литературу.Очень нужен английский но не знаю с чего начать чтоб норм понимать

Yarique
05.09.2018
08:16:31

Igor
05.09.2018
08:17:39

Yarique
05.09.2018
08:18:09
Но так исторически сложилось, и с этим и живём

Igor
05.09.2018
08:20:05
да-да, про знаковые я помнил, и про переполнение вида unsigned x = UINT_MAX; ++x; я тоже помнил, а вот про инициализацию -1 что-то заклинило

Yarique
05.09.2018
08:27:32
Я даже вспомнил когда про такое узнал и запомнил
https://events.yandex.ru/lib/talks/4273/
Спасибо РГ21 за приглашение Marshall Clow, было круто.

Google

Aidar
05.09.2018
08:32:25
Не хочешь еггор юзай move

Ilia
05.09.2018
08:44:07

Igor
05.09.2018
08:44:53
да, вот ребята хотять избежать использования в невалидном состоянии путем замены милосердного move на убийственное transfer

Ilia
05.09.2018
08:45:06

Matwey
05.09.2018
08:45:44

Ilia
05.09.2018
08:45:57

Spoonson
05.09.2018
08:47:12

Ilia
05.09.2018
08:49:06
Ну умные указатели решают проблему неопределённого времени жизни объекта.

Spoonson
05.09.2018
08:49:39

Antony
05.09.2018
09:13:29
И не std, это же не библиотечная явно фича.
Тут сложный момент. Если делать это не библиотекчным решением, то это должно быть что-то, что не пересекается с имеющимися пользовательскими функциями. Тоесть сделать borrow(x) - нельзя, у пользователей может быть функция borrow, а мы её таким образом сломаем. можно сделать auto y = borrow x; но надо продумать граничные случаи. Так например, хотим ли мы позволять делать borrow x; без захвата возращённого значения? Если да - то будут проблемы с тем, что у пользователя может быть класс borrow

Dmitry
05.09.2018
09:16:30

Antony
05.09.2018
09:20:28

Дед Пегас
05.09.2018
09:23:07

Antony
05.09.2018
09:25:14

Egor
05.09.2018
09:26:31
Did you mean: auto [ok, if] = we.insert(data);

Дед Пегас
05.09.2018
09:26:41

Evgeniy
05.09.2018
09:28:41
первая страница

Google


Igor
05.09.2018
10:12:45
Тут сложный момент. Если делать это не библиотекчным решением, то это должно быть что-то, что не пересекается с имеющимися пользовательскими функциями. Тоесть сделать borrow(x) - нельзя, у пользователей может быть функция borrow, а мы её таким образом сломаем. можно сделать auto y = borrow x; но надо продумать граничные случаи. Так например, хотим ли мы позволять делать borrow x; без захвата возращённого значения? Если да - то будут проблемы с тем, что у пользователя может быть класс borrow
если была borrow(Some &&x) и мы введем template<T> std::borrow(T &&x) то ничего не сломается, ибо пользовательская перегрузка будет приоритетнее шаблонной
если была template<T>(T &&x), то компилятор грязно выругается "ambiguous function call/declaration"
если был class borrow{}; borrow x; и мы введём keyword borrow, то компилятор грязно выругается "нельзя использовать ключевое слово в качестве идентификатора"
что я упускаю, помимо фобии комитета "нельзя чтобы -std=c++43 вместо -std=c++40 приводил к ошибкам компиляции"?
//ну или я неправильно понял озвученные проблемы


Yarique
05.09.2018
10:40:02

Evgeniy
05.09.2018
10:42:06

Antony
05.09.2018
10:55:52

Igor
05.09.2018
10:58:00
никогда не пойму почему нельзя, если смена компилятора и так приводит к куче ошибок и приходится править кучу мест(

Alexander
05.09.2018
11:00:04
Стандарт не виноват, что ваш код ломается при смене компилятора

Antony
05.09.2018
11:00:33

Alexander
05.09.2018
11:01:00
(но всё же даже Стандарт иногда ломает обратную совместимость)

Assasin
05.09.2018
11:03:55
мне кажется, это довольно фундаментальная фича, как rvalue references, которую просто нельзя пихать в стандартную библиотеку, ибо это относится полностью только к этапу компиляции.

Igor
05.09.2018
11:03:58
просто для меня ситуация "обновили/поменяли компилятор/либу -> чиним ошибки компиляции" не то что не является не ожиданной, её наоборот, всецело ожидаешь ибо "новые цацки завезли, старый хлам вывезли, а у нас наверняка где-то этот хлам был нужен в давнокоде"
переезд без ремонта - это безусловно было бы здорово, но это скорее приятный бонус нежели цель
а где-то там комитет трясётся "не, нельзя auto_ptr удалить, про него даже в книжках успели написать, и кейворд abstract нельзя вводить, вдруг у кого-то есть bool abstarct;", и это делает меня грустить, хоть я и понимаю их аргументировку

Assasin
05.09.2018
11:09:01
а для чего abstract?

Igor
05.09.2018
11:09:31
да от балды, первый кейворд из C# который вспомнился)

Aidar
05.09.2018
11:38:04

Antony
05.09.2018
15:45:05

Anton
05.09.2018
16:27:37
enum {yellow, black} kek;
const char* str = typeid(-+-+-+kek).name();
2 вопроса:
1) Почему это работает?
2) Почему тип такого выражения - int?
Что интересно, с enum class так сделать не получится

Aidar
05.09.2018
16:28:24
Хм после введения вашей штуки с мувом будет можно писать последовательностьвызововбейздапи типобезопасно
Foo obj;
auto obj = do1(transfer(obj));
auto obj = do2(transfer(obj));
auto obj = do3(transfer(obj));

Google

Aidar
05.09.2018
16:30:45
Хм

Ilia
05.09.2018
16:32:08

Anton
05.09.2018
16:32:28

Aidar
05.09.2018
16:32:59
enum не создает новый тип
Можешь считать псевдонимом