Size: a a a

2020 October 03

АК

Александр Караев... in pro.cxx
Dmitry Sokolov
Кстати, относительно строк давно заметил, не хватает какого-то literal_view с гарантированным static storage duration. Очень удобно для всяких перегрузок понимать что память можно не выделять. Использую такой самодельный, очень удобно, типа req.headers.add(header::content_type, "application/json"_lv)
Если не ошибаюсь, такой подход в разных json либах используется. Там отдельный тип для литеральной строки
источник

DS

Dmitry Sokolov in pro.cxx
Так можно для expected строить noexcept error type с дополнительной информацией о контексте в виде такого literal view например. Как расширение error code.
источник

m

magras in pro.cxx
magras
Мне кажется сингтон все равно будет нужен, так как error_code хранит указатель на категорию, если я правильно помню.
Проверил свою память. Действительно нельзя использовать разные объекты категорий (каждый инстанс будет считаться независимой категорией), так как оператор сравнения не виртуальный.
источник

ДЛ

Дмитрий ⬡ Лапшин... in pro.cxx
Коллеги, подскажите с NRVO:

return a += b;

получается ведь хуже, чем

a += b;
return a;

? Потому что компилятор заведомо не докажет, что += возвращает ссылку на первый аргумент?
источник

AG

Alexander Galagutski... in pro.cxx
Дмитрий ⬡ Лапшин
Коллеги, подскажите с NRVO:

return a += b;

получается ведь хуже, чем

a += b;
return a;

? Потому что компилятор заведомо не докажет, что += возвращает ссылку на первый аргумент?
А вы пробовали посмотреть на бинарник?
источник

ДЛ

Дмитрий ⬡ Лапшин... in pro.cxx
Alexander Galagutskiy
А вы пробовали посмотреть на бинарник?
А там уже как оптимизатор положит.
источник

AG

Alexander Galagutski... in pro.cxx
Я вот и пытаюсь понять почему компилятор не будет знать о том что это два разных выражения
источник

AG

Alexander Galagutski... in pro.cxx
Это в спецификации где-то указано мне искренне интересно понять причины таких выводов
источник

D

Dmitriy in pro.cxx
Дмитрий ⬡ Лапшин
Коллеги, подскажите с NRVO:

return a += b;

получается ведь хуже, чем

a += b;
return a;

? Потому что компилятор заведомо не докажет, что += возвращает ссылку на первый аргумент?
Да
источник

D

Dmitriy in pro.cxx
Аналогично возврату L-value ref из тернарного оператора и т.п.
источник

AG

Alexander Galagutski... in pro.cxx
А почему так ? Есть где посмотреть детали ?
источник

D

Dmitriy in pro.cxx
Alexander Galagutskiy
А почему так ? Есть где посмотреть детали ?
Потому что они возвращают L-value reference
источник

AG

Alexander Galagutski... in pro.cxx
Dmitriy
Потому что они возвращают L-value reference
А разве оптимизация не должна помочь этому ? Я имею введу что тут очевидно видно что дальше не используется это временное значение
источник

D

Dmitriy in pro.cxx
Alexander Galagutskiy
А разве оптимизация не должна помочь этому ? Я имею введу что тут очевидно видно что дальше не используется это временное значение
Стрельба в ногу Стандартом не запрещена...))
Надо подойти к вопросу с чисто формальной точки зрения. Ссылка Type& не считается временным значением.
источник

AG

Alexander Galagutski... in pro.cxx
Dmitriy
Стрельба в ногу Стандартом не запрещена...))
Надо подойти к вопросу с чисто формальной точки зрения. Ссылка Type& не считается временным значением.
Я либо не понимаю либо я застрял немного в другом языке. Разве стандарт не говорит о видимом виде исполнения? Или в данном случае это уже компилятор выбирает выбрать так или все же исполнить так но с оптимизацией
источник

AG

Alexander Galagutski... in pro.cxx
Dmitriy
Стрельба в ногу Стандартом не запрещена...))
Надо подойти к вопросу с чисто формальной точки зрения. Ссылка Type& не считается временным значением.
Или я непросканировал слово стрельба в ногу не запрещена и тогда все сходится )
источник

AK

Andrei K in pro.cxx
Dmitriy
Потому что они возвращают L-value reference
Я стесняюсь спросить, а как lvalue reference связано с copy elision?
источник

AG

Alexander Galagutski... in pro.cxx
Andrei K
Я стесняюсь спросить, а как lvalue reference связано с copy elision?
Я сам сижу и пытаюсь понять
источник

VB

Vladimir Bayrashevsk... in pro.cxx
Andrei K
Я стесняюсь спросить, а как lvalue reference связано с copy elision?
Если вы видите "A& operator+=(A& lhs, const A& rhs);", вы можете сказать _точно_, что возвращает этот оператор? Вот и компилятор тоже не может, не пытаясь решить неразрешимую задачу (см. теорема Райса).
источник

AK

Andrei K in pro.cxx
Vladimir Bayrashevskiy
Если вы видите "A& operator+=(A& lhs, const A& rhs);", вы можете сказать _точно_, что возвращает этот оператор? Вот и компилятор тоже не может, не пытаясь решить неразрешимую задачу (см. теорема Райса).
Это может работать по-разному. Сильно зависит от оптимизатора. К примеру, пасс оптимизитора, который делает RVO может находится после того как был сгенерирован код для += и оптимизатор может инферрить какие-то вещи о возвращаемом значении.
источник