Тернарный оператор без второго операнда

Это двухногий вопрос: один для C и один для С++.

Что означают стандарты C и С++ о следующем использовании тройного оператора (?:):

const char* opt = /* possible NULL pointer */;
const char* str = opt ?: "";

Когда это стало законным? Является ли это расширением компилятора? Каковы требования к первому операнду (неявно конвертируемому в bool/int)?

Ответ 1

GCC предоставляет это как расширение . Это не в стандарте С++.

Семантика заключается в том, что если условие отличное от нуля, значение выражения равно выражению условия.

Неявное требование состоит в том, что условие должно быть совместимо с типом с третьим операндом, т.е. можно преобразовать в другое, следуя обычным правилам условного оператора.

Важно отметить, что если условие вычислено из функции с побочными эффектами, это значение не будет пересчитано с помощью этого расширения:

opt() ?: ""; //opt called once
opt() ? opt() : ""; //opt called twice

Ответ 2

Тернарный оператор с опущенным средним операндом:

const char* str = opt ?: "";

- это расширение GNU, не стандартное С++.