getline dans la déclaration si

D’après ce que j’ai lu, getline() utilisé dans un contexte booléen renvoie implicitement une conversion en void* . Je n’ai trouvé nulle part sur le Web une référence réelle à cette déclaration. Partout, il est écrit que la conversion implicite n’existe pas et que, dans un contexte booléen, les pointeurs doivent être du même type (et si ptr == 0 0 est converti en type du pointeur ptr ).

Toujours dans la norme, dans un contexte booléen, il est converti en type non spécifié-Boolean. Qu’est ce que ça veut dire?

En bref:

Cela signifie que vous pouvez utiliser getline() dans une instruction if et si cela fonctionne, vous entrez le bloc de l’instruction if .

En long:

getline() utilisé dans un contexte booléen renvoie une conversion implicite à void* .

Ce qui précède n’est pas techniquement correct (mais c’est le résultat). getline() renvoie en fait une référence au stream sur getline() il a été utilisé. Lorsque le stream est utilisé dans un contexte booléen, il est converti en un type non spécifié (C ++ 03) pouvant être utilisé dans un contexte booléen. En C ++ 11, cela a été mis à jour et il est converti en bool .

  • Si la commande getline() réussit, elle renvoie un stream en bon état. Lorsque cela est converti en un type de type bool il retourne un pointeur non nul (C ++ 03) qui, lorsqu’il est utilisé dans un contexte booléen, est équivalent à true .
  • Si la commande getline() échoue, elle renvoie un stream en mauvais état. Lorsque cela est converti en un type bool il retourne un pointeur null (C ++ 03) qui, lorsqu’il est utilisé dans un contexte booléen, est équivalent à false .

Je n’ai trouvé nulle part sur le Web une référence réelle à cette déclaration.

  • 21.4.8.9 Inserteurs et extracteurs [ssortingng.io]
    • Définit: std :: istream & getline (std :: istream &, std :: ssortingng &)
  • 27.7.2.1 Modèle de classe basic_istream [istream]
    • Définit: std :: istream & getline (char_type * s, streamsize n);
  • 27.5.5.1 Présentation [ios.overview]
    • Définit comment un stream est converti dans un contexte booléen

Partout, il est écrit que la conversion implicite n’existe pas et que, dans un contexte booléen, les pointeurs doivent être du même type (et si ptr == 0 0 est converti en type du pointeur ptr ).

Un void* nul void* dans un contexte booléen équivaut à false , tout autre void* équivaut à true . (Bien que le type ne soit en réalité pas spécifié, mais vous pouvez le considérer comme un void* (juste pour le rendre plus facile à penser).

Toujours dans la norme, dans un contexte booléen, il est converti en type non spécifié-Boolean. Qu’est ce que ça veut dire?

Cela signifie que vous pouvez utiliser toutes les instructions conditionnelles:

 if (getline()) { // If getline worked processes data } while(getline()) { // getline. If it works then processes then try again. } 

Il ne le dit pas explicitement n’importe où sur le Web, car il implique de rassembler trois faits différents.

  1. getline() renvoie istream&
  2. istream est convertible en void*
  3. Cette conversion est utilisée lorsqu’un istream est utilisé dans un contexte booléen (tel qu’une instruction if ou while ).