2013-08-18 1 views
2

I devrait initialiser l'objet de B ici, mais je me suis déclaration de fonction:déclaration de fonction au lieu de constructeur invoquer en C++

#include <iostream> 
using namespace std; 

class A {}; 

class B { 
    public: 
     B(const A&) { 
     cout << "B: conversion constructor\n"; 
    } 
}; 

int main() 
{ 
    B b(A()); //function declaration: B b(A(*)()); 
    b.test(); 
} 

La sortie est: demande de membre « test » dans « b », qui est de type non-classe 'B (A ( *)())' *

Pourquoi le constructeur n'est-il pas invoqué dans cette situation?

+1

Regardez l'analyse syntaxique le plus contrariant. – chris

+2

http://en.wikipedia.org/wiki/Most_vexing_parse – RichieHindle

+0

Super, merci. –

Répondre

1

Ceci est l'un des nombreux cas où l'analyseur pense qu'une déclaration variable est une déclaration de fonction, essayez d'écrire comme:

B b = A() ; // Now the compiler doesn't think that it's a function declaration 
+0

Je l'ai remarqué, mais il est étrange que 'B b (A());' ne soit pas reconnu comme appel de constructeur. –

+0

@RomanVorobiy: Il correspond exactement à la syntaxe de déclaration de fonction: Il déclare une fonction 'b' en prenant un argument de type' A() 'et en retournant un argument de type' B'. – celtschk

+1

Notez l'autre option: 'B b {A {}};' – chris

Questions connexes