cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Elvis operator #94

Open Neargye opened 3 years ago

Neargye commented 3 years ago

Перенос предложения: голоса +34, -5 Автор идеи: Jovibor

https://en.wikipedia.org/wiki/Elvis_operator

auto ptr = func() ?: otherPtr;`

Вместо:

auto ptr = func() ? func() : otherPtr;`

//или

auto p = func();
auto ptr = p ? p : otherPtr;
Neargye commented 3 years ago

Игорь Гусаров 30 января 2020, 14:22

  1. Он планируется перегружаемым?

  2. Учитывая разрешение объявления переменных в условии if, можно попробовать обобщить эту практику, разрешив объявление переменных в условии оператора ?:.

auto result = (auto x = foo()) ? x : otherFoo;

auto ptr = (auto p = strchr(line, '=')) ? p + 1 : "";

Antervis 11 февраля 2020, 19:01 дилемма в том, что чаще нужно что-то типа

string p = foo(); return p ? p : "null"; что как раз и наводит нас на вопрос о перегружаемости. Для std::optional было бы удобно:

return foo() ?: "abc"; // вместо auto res = foo(); // optional return res ? *res : "abc";

Андрей Попандопуло 18 июня 2020, 14:28 Предлагаемый синтаксис скорее заставит и компилятор и интеллисенс задуматься о том, что на лицо явная синтакическая ошибка. Предложение Игря Гусарова выглядит в этом случае предпочтительнее. На мой взгляд, лучше, чтобы такой оператор вообще был похож на if с инициализацией. Например:

auto result = (auto &&val {calc()}; val < 0) ? 0 : val; В отличии оригинального предложения, где сравнение (в С# или Javascript) происходит с null, сдесь можно производить любое сравнение без многократного вызова кода, создающего сравниваемое значение. Естественно, scope этой переменной сам оператор. Голосую "за" саму идею, но предлагаемый синтаксис, как по мне, - не очень.

Jovibor 19 июня 2020, 3:22 Андрей Попандопуло,

Можно и так. Правда это более громоздко.

Основная-же идея здесь это однострочность, и лишь однократный вызов предикатной ф-ии.