В Javascript, если у меня есть потенциально нулевой объект obj, который, если он не равен нулю, будет иметь поле x - я могу написать obj?.x. Это называется «необязательной цепочкой» или «безопасной навигацией»: если obj имеет значение null или иным образом не является объектом с доступными полями, он не будет выдавать исключение, просто создаст значение null. (Он также не будет выдаваться, если obj является объектом, но не имеет поля x, хотя это менее актуально для этого вопроса).
Теперь давайте обратимся к C++, который, начиная с C++17, имеет стандартную библиотеку std::optional. Предположим, у нас есть:
и у меня есть дополнительный объект с именем obj. По наивности я мог бы написать выражение:
... но это не сработает, поскольку типы двух результирующих выражений различны, и тринарный оператор их не гармонизирует. Годболт подтверждает этот код:
Код: Выделить всё
#include
using Bar = int;
struct Foo { Bar x; };
std::optional f()
{
std::optional obj {};
return obj ? obj->x : std::nullopt;
}
Итак, какая короткая идиома существует для выражения obj?.x в C++?
Примечание. Подойдет любая стандартная версия языка, но, очевидно, чем старше, тем лучше.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... l-chaining