2016-01-08 21 views
10

Questa è una domanda a due gambe: una per C e una per C++.Operatore ternario senza secondo operando

Che standard C++ C e hanno da dire sulla seguente uso del l'operatore ternario (?:):

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

Quando è diventato legale? È un'estensione del compilatore? Quali sono i requisiti per il primo operando (implicitamente convertibile in bool/int)?

risposta

21

GCC fornisce questo come extension. Questo non è nello standard C++.

La semantica è che se la condizione è diversa da zero, il valore dell'espressione è quello della condizione.

Il requisito implicito è che la condizione deve essere compatibile con il tipo con il terzo operando, ovvero una può essere convertita nell'altra seguendo le normali regole dell'operatore condizionale.

E 'importante notare che se la condizione è calcolato da una funzione con effetti collaterali, il valore sarà non essere ricalcolata con questa estensione:

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

L'operatore ternario all'operando mezzo omesso:

const char* str = opt ?: ""; 

è un'estensione GNU non è normale C++.

+0

Grazie. E qual è il requisito del suo primo operando? – YSC

+0

@ YSC: i valori di condizione e verità sono coalizzati: 'opt?:" "' Equivale a 'opt? opt: "" '. –

+2

TartanLlama ha già dato questa risposta. – 101010