1

Je suis assez surpris que ce struct, qui est seulement explicitement convertible en bool, fonctionne très bien dans une déclaration if:explicite et conversion implicite

struct A 
{ 
    explicit operator bool() const 
    { 
     return m_i % 2 == 0; 
    } 

    int m_i; 
}; 

int main() 
{ 
    A a{ 10 }; 

    if (a) // this is considered explicit 
    { 
     bool b = a; // this is considered implicit 
        // and therefore does not compile   
    }   
    return 0; 
} 

Pourquoi est-il? Quelle est la raison de conception derrière le standard C++? Personnellement, je trouve plus explicite la deuxième conversion que la première. Pour le rendre encore plus clair, je me serais attendu le compilateur forçant à avoir les éléments suivants pour les deux cas:

int main() 
{ 
    A a{ 10 }; 

    if ((bool)a) 
    { 
     bool b = (bool)a; 
    }   
    return 0; 
} 
+0

Oui, dans 'if' est comme une conversion explicite en bool. (Vous ne pouvez pas être plus explicite que d'utiliser 'if' pour convertir en 'bool'!). http://en.cppreference.com/w/cpp/language/explicit – alfC

Répondre

2

§6.4 déclarations de sélection [stmt.select]

  1. La valeur d'une condition qui est une expression est la valeur de l'expression, convertie contextuellement en booléenne pour les instructions autres que le commutateur;

§4 conversions standard [conv]

Certaines constructions linguistiques exigent que l'expression soit converti en une valeur booléenne. Une expression e apparaissant dans un tel contexte est dite pour être convertie contextuellement en booléenne et est bien formée si et seulement si la déclaration bool t(e); est bien formée, pour certains inventés variable temporaire t (8.5).

Ainsi, l'expression de la condition if doit être contextuellement convertible en bool, ce qui signifie que les conversions explicites sont autorisées.

C'est le mode le plus probable fait parce que la condition de ifne peut évaluer à une valeur booléenne, donc en disant if(cond) vous déclarez explicitement que vous voulez cond à évaluer une valeur booléenne.

+0

Merci, je n'ai jamais entendu parler du concept de * contextuellement convertible * avant. Pouvez-vous ajouter à votre réponse dans quels cas une opération de conversion est supposée être contextuelle? – nyarlathotep108

+1

@ nyarlathotep108 comme condition d'une instruction 'if'' while' 'for'. A part ça, je devrais scanner la norme entière. Et est au-delà de la portée de la question. – bolov

+2

@ nyarlathotep108 trouvé lors d'un balayage rapide: l'opérande de l'opérateur de négation logique ('! Op'), les opérandes d'opérateurs logiques (par exemple' op1 && op2'), d'opérateur conditionnel '? : ', l'affirmation sur un' static_assert', non sauf le spécificateur. – bolov