cpp-ru / ideas

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

Null-coalescing оператор ?? и Null-conditional оператор ?-> #205

Closed apolukhin closed 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +1, -11 Автор идеи: x4mmm

Бинарный оператор ?? возвращает левый аргумент, если он не nullptr и правый в остальных случаях. Оператор ?-> производит обращение к члену класса указателя, если указатель не nullptr, иначе отменяет текущий оператор (statement).

Null-coalescing позволяет, например, такую контрукцию

abstract class SomeProlificInterface {public: abstract void SomeSuspiciosCall()}

class AllowedInterface1: SomeProlificInterface {...}

class AllowedInterface2: SomeProlificInterface {...}

class DisallowedInterface1: SomeProlificInterface {...}

class DisallowedInterface2: SomeProlificInterface {...}

auto o = AquireSomeProlificInterface();

(dynamic_cast<AllowedInterface1>(o)??dynamic_cast<AllowedInterface2>(o))?->SomeSuspiciosCall();
apolukhin commented 3 years ago

Antervis, 13 июля 2017, 12:40 обычно проверка против nullptr обрабатывается как-то иначе, нежели "ничего не делать".

x4mmm, 14 июля 2017, 11:51 Antervis,

  1. Замена отсутствуюего значения на значение по умолчанию
  2. Вызов события у объёкта при наличии объекта
  3. Создание временного объекта при его отсутствии, различные варианты Lazy поведения

Этот proposal из C#, там точно также много лет были аргументы - "null всегда нужно обрабатывать не через nop". Фича появилась и ей все очень довольны.

Да, она нужна не для ООП а для т.н. "языков работы с объектами", когда человек вызывает незнакомое ему API в стиле "пархающей кувалды". Но эта фича существенно упрощает написание программ, исследюущих это API. И не открывает большого количества путей для новых багов.

dix75, 28 июля 2017, 11:14 Повтор #124