Voici mon code:
#include <iostream>
using namespace std;
class Sales{
public:
Sales(int i = 0):i(i){}
explicit operator int(){ return i; }
private:
int i;
};
int main(){
Sales s(5);
if(s == 4) cout << "s == 4" << endl;
else cout << "s != 4" << endl;
return 0;
}
Dans l'amorce de c ++ (5e), il est dit:
le compilateur appliquera une conversion explicite à une expression utilisée comme condition
Mais dans ce cas, il n'y a pas de telle conversion. Lorsque je supprime explicit
, le code fonctionne correctement.
Cependant, quand je change
explicit operator int(){ return i; }
pour
explicit operator bool(){ return i != 0; }
,
et changez if(s == 4)
en if(s)
respectivement, alors le code fonctionne bien.
On dirait que la règle de conversion est un peu déroutante, quelqu'un peut-il expliquer cela plus en détail?
Parmi les conversions implicites , depuis C ++ 11, la fonction de conversion définie par l'utilisateur explicite sera considérée pour les conversions contextuelles ; ce qui se produit dans les contextes suivants et lorsque le type bool
est attendu. Car int
, ce n'est pas appliqué.
Dans les cinq contextes suivants, le type
bool
est attendu et la séquence de conversion implicite est construite si la déclaration bool t (e); est bien formé. c'est-à-dire la fonction de conversion définie par l'utilisateur explicite telle que l'opérateur explicite T :: bool () const; est considéré. On dit qu'une telle expression e est contextuellement convertible en booléen.controlling expression of if, while, for; the logical operators !, && and ||; the conditional operator ?:; static_assert; noexcept.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots