Почему в C++ до сих пор не реализован оператор условного обращения к значению (Null-Conditional Operator)?

Необходимо рассмотреть возможность введения операторов для работы с указателями. Например, данный код: <br/> <pre><code class="cpp">const Component* tooltip = GetToolTip();
tooltip?.OnRender(); // tooltip?-&gt;OnRender();</code></pre> мог бы преобразовываться в следующий вариант: <br/> <pre><code class="cpp">const Component* tooltip = GetToolTip();
if(tooltip)
{
    tooltip-&gt;OnRender();
}</code></pre>
  • 4 марта 2025 г. 5:54
Ответы на вопрос 2
Оператор условного обращения к значению (Null-Conditional Operator), такой как `?.`, широко используется в других языках программирования, например, в C# и Kotlin, для упрощения работы с промежуточными значениями, которые могут быть `null`. Однако в C++ этого оператора нет, и есть несколько причин, почему его реализация может быть сложной и, возможно, нежелательной:

1. **Философия языка**: C++ нацелен на максимальную производительность и минимальное абстрагирование. Автоматическое добавление операторов, влияющих на управление потоком, может привести к неопределённому поведению и трудно отлаживаемым ошибкам. Оператор `?.` мог бы снижать ясность кода, что противоречит философии языка.

2. **Указатели vs. умные указатели**: В современном C++ рекомендуется использовать умные указатели (например, `std::shared_ptr`, `std::unique_ptr`) вместо сырых указателей. Умные указатели принимают на себя управление жизненным циклом объектов и уменьшают вероятность ошибок, связанных с использованием `null`. Оператор `?.` в контексте сырых указателей может не иметь смысла, поскольку использование умных указателей предоставляет больше безопасности.

3. **Сложность реализации**: Введение нового оператора требует изменений в компиляторе, а также в существующих библиотеках и стандартах языка. Это может вызвать множество обратных несовместимостей и потребовать значительных усилий.

4. **Существующая функциональность**: В C++ уже есть способы выполнения аналогичного функционала без добавления нового оператора:
   - Использование явных проверок на `nullptr`, как в вашем примере.
   - Использование библиотечных функций и шаблонов, таких как `std::optional`, что позволяет более безопасно работать с потенциально отсутствующими значениями.

5. **Разные подходы к ошибкам и исключениям**: В C++ распространены разные подходы к обработке ошибок и отсутствию значений, что делает более чем очевидным, что новый оператор несёт в себе различные смысловые нагрузки, которые могут не совпадать со стандартными практиками языка.

Таким образом, хотя оператор условного обращения к значению может упростить код в некоторых случаях, в C++ существует множество альтернативных подходов и философия языка, которые не предполагают его внедрение.
Используйте метод and_then, он как раз для этого.
Похожие вопросы