Если у вас есть следующее:
if (x)
{
y = *x;
}
else
{
y = 0;
}
Тогда поведение гарантированно будет определено, поскольку мы можем только разыменовать x
если это не 0
Можно ли сказать то же самое для:
y = (x) ? *x : 0;
Кажется, это работает как ожидалось (даже скомпилировано с -Wpedantic
на г ++)
Это гарантировано?
Да, будет оцениваться только второй или третий операнд, черновик стандартного раздела C ++ 5.16
[Expr.cond] говорит:
Условные выражения группы справа налево. Первое выражение контекстно преобразуется в bool (пункт 4).
Он вычисляется, и если оно истинно, результатом условного выражения является значение второго выражения,
в противном случае это третье выражение. Только одно из второго и третьего выражений оценивается. Каждое значение
вычисление и побочный эффект, связанный с первым выражением, секвенируются перед каждым вычислением значения
и побочный эффект, связанный со вторым или третьим выражением.
Других решений пока нет …