Короткое замыкание троичного оператора определенным образом

Если у вас есть следующее:

if (x)
{
y = *x;
}
else
{
y = 0;
}

Тогда поведение гарантированно будет определено, поскольку мы можем только разыменовать x если это не 0

Можно ли сказать то же самое для:

y = (x) ? *x : 0;

Кажется, это работает как ожидалось (даже скомпилировано с -Wpedantic на г ++)

Это гарантировано?

9

Решение

Да, будет оцениваться только второй или третий операнд, черновик стандартного раздела C ++ 5.16 [Expr.cond] говорит:

Условные выражения группы справа налево. Первое выражение контекстно преобразуется в bool (пункт 4).
Он вычисляется, и если оно истинно, результатом условного выражения является значение второго выражения,
в противном случае это третье выражение. Только одно из второго и третьего выражений оценивается. Каждое значение
вычисление и побочный эффект, связанный с первым выражением, секвенируются перед каждым вычислением значения
и побочный эффект, связанный со вторым или третьим выражением.

15

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]