Elvis operator

Jovibor
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;
21
рейтинг
4 комментария
Игорь Гусаров

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

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

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

auto  ptr = (auto p = strchr(line, '=')) ? p + 1 : "";
Игорь Гусаров
Antervis

дилемма в том, что чаще нужно что-то типа

string* p = foo();
return p ? *p : "null";

что как раз и наводит нас на вопрос о перегружаемости. Для std::optional было бы удобно:

return foo() ?: "abc";
// вместо
auto res = foo(); // optional<string>
return res ? *res : "abc";
Antervis
Обновлено 
Андрей Попандопуло

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

auto result = (auto &&val {calc()}; val < 0) ? 0 : val;

В отличии оригинального предложения, где сравнение (в С# или Javascript) происходит с null, сдесь можно производить любое сравнение без многократного вызова кода, создающего сравниваемое значение. Естественно, scope этой переменной сам оператор.
Голосую "за" саму идею, но предлагаемый синтаксис, как по мне, - не очень.

Андрей Попандопуло
Обновлено 
Jovibor

Андрей Попандопуло,

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

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

Jovibor
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения