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; }
3 Réponses :
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 );
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)));
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 (...) code> nécessite
B code> 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 (...) code> ne le nécessite pas.
vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());
De manière inattendue, elle s'est transformée en un bon argument contre à l'aide de l'espace de noms code> :)
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