Le code contient quelques bogues syntaxiques et sémantiques. Corrigeons-les
class A
{
public:
A() {};
operator bool() { return true; }
};
int main()
{
if (A a = A())
{
// do stuff
}
}
Vous pouvez choisir de changer le type de la fonction de conversion en autre chose. Comme écrit, la conversion booléenne réussira également à se convertir en n'importe quel type entier. La conversion en void*
limitera la conversion à bool et void*
, qui est un idiome couramment utilisé. Encore une autre et une meilleure façon est de convertir en un type privé, appelé safe bool idiom.
class A
{
private:
struct safe_bool { int true_; };
typedef int safe_bool::*safe_type;
public:
A() {};
operator safe_type() { return &safe_bool::true_; }
};
Retour à la syntaxe: Si vous avez une partie d'autre, vous pouvez utiliser le nom de la variable déclarée, parce qu'elle est encore portée. Il est détruit après que toutes les branches sont traitées avec succès
if(A a = A())
{ ... }
else if(B b = a)
{ ... }
Vous pouvez également utiliser le même nom que précédemment, et la variable ombre les autres variables, mais vous ne pouvez pas déclarer le même nom dans le bloc le plus extérieur d'une branche - Il sera en conflit plutôt que de se cacher avec l'autre déclaration.
if(int test = 0)
{ ... }
else
{ int test = 1; /* error! */ }
La technique de déclarer et initialiser une variable est le plus souvent utilisé avec dynamic_cast
bien, mais peut être parfaitement utilisé conjointement avec un utilisateur type défini comme ci-dessus, trop
if(Derived *derived = dynamic_cast<Derived*>(base)) {
// do stuff
}
Notez que syntaxiquement, vous devez initialiser la variable (en utilisant le formulaire = expression
comme pour un argument par défaut). Ce qui suit n'est pas valide
if(ifstream ifs("file.txt")) {
// invalid. Syntactic error
}
Quelle est votre intention avec ce code? Est-ce que la conversion à bool retourne toujours vrai? Si c'est le cas, l'instruction if est redondante. –
Je suppose que c'est un morceau de code rapide. "Bool operator()() {return foo;}" ne serait-il pas un meilleur exemple? –
A quoi sert-elle? Cherchez-vous des erreurs? – GManNickG