Short-circuiting is natural for operators (as it already exists in or
etc.) and useful for lazy evaluation in:
x ?? calculate_expensive_fallback()
.
Old broken x or default
constructs can easily be fixed to x ?? default
without introducing more bugs in the rewrite to coalesce(x, default)
which requires editing in three places instead of one.
Chaining is much clearer and less error prone with operators:
(override ?? fallback).name ?? default
coalesce(coalesce(override, fallback).name, default)
The word coalesce is difficult to remember and spell.
A coalesce function can not replace ?.
etc. I think?
A keyword-based coalesce
operator x coalesce default
could be plausible, but seems implausible for ?.
etc.
Overall ??
wins IMO. (And is already more familiar from other languages.)