Esistono regole per la conversione del tipo implicito per gli argomenti dell'operatore ternario?C++: Operatore ternario (operatore condizionale) e le sue regole di conversione di tipo implicito
L'operatore ternario deve sempre restituire lo stesso tipo. Questo tipo è determinato esclusivamente dal secondo e dal terzo argomento (1st ? 2nd : 3rd
), pertanto entrambi gli argomenti vengono convertiti in questo tipo. Come viene determinato questo tipo?
Per essere più precisi, ho testato un esempio:
class pointclass
{
pointclass();
pointclass(int i); // (pointclass)(int)
operator bool() const; // (bool)(pointclass)
};
Ho una classe (pointclass
), che consente la conversione implicita da int
a pointclass
e conversione implicita da pointclass
a bool
.
int i;
pointclass p;
bool b;
b ? p : i; // (bool) ? (int)(bool)(pointclass) : (int)
b ? i : p; // (bool) ? (int) : (int)(bool)(pointclass)
Utilizzando l'operatore ternario, metto a confronto pointclass
e int
. Il compilatore utilizza la conversione implicita da pointclass
a bool
e quindi la conversione standard da bool
a int
. Questo è fatto, non importa se scambio gli argomenti 2 ° e 3 °. Perché non converte int
in pointclass
?
Utilizzando un operatore di confronto è molto più semplice:
p == i; // (pointclass) == (pointclass)(int)
i == p; // (int) == (int)(bool)(pointclass)
Il tipo degli argomenti è semplicemente determinato dal primo argomento.
Ma non capisco le regole di conversione del tipo dell'operatore ternario. Per me sembra proprio come usare la maggior parte delle conversioni.
Sì, le regole sono in [expr.cond] nello standard. – chris
Qualcuno più esperto in modi standard di me può dare una risposta autoritaria, ma come regola empirica, si convertono al tipo comune "più vicino" in cui possono essere convertiti. – SergeyA
Se pensi che il C++ faccia cose strane, risparmi un pensiero per i poveri ragazzi di Java. – Bathsheba