Existe um operador de navegação seguro para C ++?

No C ++ moderno, existe uma maneira de fazer uma navegação segura?

Por exemplo,em vez de De fazer...

if (p && p->q && p->q->r)
    p->q->r->DoSomething();

... tendo uma sintaxe sucinta usando algum tipo de ponteiro inteligente em curto-circuito, ou algum outro tipo de sintaxe que alavanque a sobrecarga do operador, ou algo na Biblioteca C ++ padrão ou no Boost.

p?->q?->r?->DoSomething(); // C++ pseudo-code.

O contexto é C ++ 17 em particular.