没有第二个操作数的三元运算符

Ternary operator without second operand

这是一个两条腿的问题:一条针对 C,一条针对 C++。

C 和 C++ 标准对以下三元 (?:) 运算符的使用有何规定:

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

什么时候合法的?它是编译器扩展吗?对第一个操作数有什么要求(隐式转换为bool/int)?

省略中间操作数的三元运算符:

const char* str = opt ?: "";

是 GNU 扩展,它不是标准的 C++。

GCC 将此作为 extension 提供。这不在 C++ 标准中。

语义是如果条件不为零,表达式的值就是条件的值。

隐含的要求是条件必须 type-compatible 与第三个操作数,即可以按照通常的条件运算符规则将一个转换为另一个。

请务必注意,如果条件是根据具有副作用的函数计算的,则该值将不会使用此扩展重新计算:

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