9
votes

Question touristique concernant la syntaxe de déclaration en C ++

Regarde ici: Dans le code suivant, quel serait le type de B?

struct A {
    A (int i) {}
};

struct B {
    B (A a) {}
};

int main () {
    int i = 1;
    B b(A(i)); // what would be the type of b
    return 0;
}


0 commentaires

3 Réponses :


7
votes

C'est une déclaration de fonction locale selon la norme C ++ 8.2 / 1. Vous pouvez utiliser une forme implicite de constructeur pour éviter cela ou les suivants:

B b(A(i)); // is equal to B b( A i );

// ---

// to declare variable of type B write:
B b = A(i);
// explicit form if you want:
B b( static_cast<A>(A(i)) );
// or
B b( (A)i );


0 commentaires

7
votes

L'une des verrues de C (et le hériter de C ++ le hérite (et le rend pire)) est qu'il n'ya pas de syntaxe spéciale pour introduire une déclaration. Cela signifie que les déclarations ressemblent souvent à un code exécutable. Un autre exemple:

B b((A(i)));


3 commentaires

Je crois que vous pourriez aussi faire: b b = b (a (i));


Oui, cela fonctionnerait également, est plus facile à comprendre et moins laid. :-)


... mais signifie une chose différente - b b = b (...) nécessite B pour avoir un constructeur de copie (même si le compilateur peut optimiser l'appel à celui-ci. Loin, il est toujours nécessaire de vérifier), tandis que b b (...) ne le nécessite pas.



5
votes
vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());

3 commentaires

De manière inattendue, elle s'est transformée en un bon argument contre à l'aide de l'espace de noms :)


Malheureusement, ça va plus loin que ça. Si la CIN avait été STD :: CIN alors GCC détermine que cette ligne construit en effet un objet vectoriel, alors que VC ++ (2005) se plaint que STD :: CIN ne peut pas apparaître comme nom de paramètre.


@Unclebens, malheureusement, GCC a tort avec cela et VC ++ est correct. Voir mon rapport de défaut à Clang: llvm.org/bugs/show_bug.cgi?id=4594