Size: a a a

2020 March 25

PK

Pavel Kazakov in pro.cxx
(разумеется, я могу ошибаться,) тут надо придумать для себя примеры, в которых всё понятно

допустим, есть некая void f(std::string&&); когда в неё передается аргумент таким образом:
void f(std::string("foo! bar!")), эта строка с "foo!bar!" недоступна нигде больше в программе -- её передали и забыли о ее существовании, но у нее нет identity -- к ней нельзя обратиться, -- это prvalue
источник

PK

Pavel Kazakov in pro.cxx
она "чистая" в том смысле, что с ней почти ничего сделать нельзя
источник

AT

Andrew Titov in pro.cxx
Pepe 🐸
да, каст в х-value ссылке. Или каст к pr-value, который становится х-value, короче этот момент я не очень понял
Приведение к rvalue reference - это выражение категории xvalue.
источник

PK

Pavel Kazakov in pro.cxx
а xvalue -- это value, которая где-то была до этого, у неё есть identity, но стала expire-ться :)
источник

P

Pepe 🐸 in pro.cxx
Pavel Kazakov
а xvalue -- это value, которая где-то была до этого, у неё есть identity, но стала expire-ться :)
An rvalue expression is either prvalue or xvalue.
источник

PK

Pavel Kazakov in pro.cxx
Pepe 🐸
An rvalue expression is either prvalue or xvalue.
потому что rvalue теперь стала таким же обобщением, как glvalue
источник

P

Pepe 🐸 in pro.cxx
Я бы оставил все эти value в покое но проблема в том что теперь это реально влияет на перфоманс)
источник

PK

Pavel Kazakov in pro.cxx
они обе (rvalue и glvalue) используются, когда в контексте не важны детали
источник

PZ

Pavel Zhigulin in pro.cxx
Вот сейчас мне кажется xvalue выражения - это выражения, которые порождают сущности, без имени, но у которых можно взять адрес.

Lvalue - выражения, порождающие именованные объекты с адресом.
источник

PK

Pavel Kazakov in pro.cxx
Pepe 🐸
Я бы оставил все эти value в покое но проблема в том что теперь это реально влияет на перфоманс)
общая рекомендация -- врубить ворнинги -Wpessimizing-move, ну или весь -Wpedantic, если раньше этого не было сделано
источник

P

Pepe 🐸 in pro.cxx
Pavel Kazakov
общая рекомендация -- врубить ворнинги -Wpessimizing-move, ну или весь -Wpedantic, если раньше этого не было сделано
поэтому у меня и вопрос возник что ворнинги врубил)
источник

PZ

Pavel Zhigulin in pro.cxx
Pavel Kazakov
общая рекомендация -- врубить ворнинги -Wpessimizing-move, ну или весь -Wpedantic, если раньше этого не было сделано
Это да. Но вот ругается тебе компилятор: "не делай move в return, козленочком станешь" - и вот ты пошел гуглить и снова вопросы)
источник

PK

Pavel Kazakov in pro.cxx
Widget f()
{
 return std::move(Widget{});
}
ломают copy elision -- когда нафиг не нужны никакие мув операции, а тело функции как бы исчезает
источник

PK

Pavel Kazakov in pro.cxx
Pavel Zhigulin
Это да. Но вот ругается тебе компилятор: "не делай move в return, козленочком станешь" - и вот ты пошел гуглить и снова вопросы)
это значит, что надо просто руки с руля убрать на секунду и действительно перестать делать мув в этом месте
источник

PZ

Pavel Zhigulin in pro.cxx
Вот с точки зрения компилятора - это может быть очевидный факт. Для человека это капец странная фигня)
источник

P

Pepe 🐸 in pro.cxx
Pavel Kazakov
Widget f()
{
 return std::move(Widget{});
}
ломают copy elision -- когда нафиг не нужны никакие мув операции, а тело функции как бы исчезает
угу. вопрос был чисто из интереса почему ломают. Я что то смутно помнил что RVO для r-value, а оказалось для pr-value, а результат мува х-value
источник

PK

Pavel Kazakov in pro.cxx
это странная фигня 100% -- сужу по людям рядом, которые не хотят в это въезжать, но она точно не рокет сайенс, просто нужно больше времени, чтобы оно осело в голове
источник

P

Pepe 🐸 in pro.cxx
Еще такая вещь что RVO обязательная оптимизация а NRVO необязательная, например хочется гарантировано мувнуть, но он ругается что copy elision  для NRVO не работает
источник

PK

Pavel Kazakov in pro.cxx
Pepe 🐸
Еще такая вещь что RVO обязательная оптимизация а NRVO необязательная, например хочется гарантировано мувнуть, но он ругается что copy elision  для NRVO не работает
тут тоже подвох, и его можно по cppref пропустить даже: mandatory copy elision и просто copy elision -- разные механизмы :)
источник

P

Pepe 🐸 in pro.cxx
Pavel Kazakov
тут тоже подвох, и его можно по cppref пропустить даже: mandatory copy elision и просто copy elision -- разные механизмы :)
вот вот
источник