Compréhension d'un morceau de code

Résolu
Bonjour,

Je dois comprendre le comportement de ce bout de code mais même après mes recherches, je n'ai trouvé aucune explication.
Voici le bout de code :

#include <iostream>
using namespace std;
class B{
public:
   B() { cout << "B" << endl; }
};
int main(){
   B b();
   cout << "fin" << endl;
}


Pour moi, ce bout de code afficherai "Bfin" mais il affiche "fin".
Quelqu'un aurait une explication ?
Merci d'avance.

EDIT: Ajout de la coloration syntaxique.

3 réponses

  1. Contributeur
    'lut
    B b();
    En C++, ça porte a confusion je sais, mais quand on a un constructeur sans arguments, on ne met pas les parenthèses; sinon ça n'appelle pas le constructeur, comme c'est le cas ici.
    La ligne devient donc
    B b;
    , et le programme affiche ce à quoi tu t'attendais:
    gravgun@garch:/tmp$ g++ aaa.cpp -o aaa
    gravgun@garch:/tmp$ ./aaa
    B
    fin
    1. Mais si ça n'appelle pas le constructeur implémenté, ça appelle quoi exactement ?
      1. Contributeur
        Rien. En fait, la déclaration sans paramètre mais avec parenthèses reviendrait en quelque sorte à
        B b(void);
        en C: C++ considère donc ça comme une déclaration de fonction vu que ce qui est entre parenthèses est un (ou des) types, et non des variables (ou constantes) -- ce que je trouve étrange vu que C++ ne supporte pas les fonctions imbriquées, et qu'on ne déclare pas un pointeur de fonction. Pour résoudre l'ambigüité, le standard C++ spécifie donc que ne rien mettre après le nom revient a appeler le constructeur avec 0 arguments; sauf dans certains cas, cf. le paragraphe 8.5.8.
    2. J'ai compris :)
      Merci pour la réponse et pour le temps que vous m'avez consacrer :)