Comme je sais, std::allocator<T>::constructne prend que deux paramètres sur l'ancienne version de C ++; le premier est un pointeur vers une mémoire brute non construite dans laquelle nous voulons construire un objet de type Tet le second est une valeur de type d'élément pour initialiser cet objet. Ainsi, le constructeur de copie est invoqué:
struct Foo {
Foo(int, int) { cout << "Foo(int, int)" << endl; }
/*explicit*/ Foo(int) { cout << "Foo(int)" << endl; }
Foo(const Foo&) { cout << "Foo(const Foo&)" << endl; }
};
int main(int argc, char* argv[]) {
allocator<Foo> a;
Foo* const p = a.allocate(200, NULL); // second parameter is required on C++98 but on C++11 it is optional
// Foo* const p = a.allocate(200); // works fine on C++11 but not on C++98
a.construct(p, 5, 7); // works on C++ 11 and up but not C++98
a.construct(p, 10);// works on both
a.destroy(p);
a.destroy(p + 1);
a.deallocate(p, 200);
std::cout << std::endl;
}
Pourquoi en C ++ 98
a.construct(p, 10)appeler le constructeur de copie mais en C ++ 11 et supérieur appelle juste le constructeur qui prend un entier?Est -ce que cela signifie sur C ++ 11 en raison d'une optimisation copie-élision , même si le constructeur
Foo(int)est desexplicittravaux sur cet appel:a.construct(p, 5)travaux sur C ++ 11 même le constructeur estexplicitce que je suis sûr est qu'il ne fonctionne pas sur C ++ 98 siFoo(int)estexplicit.Si oui, alors si je compile cette déclaration avec une sorte d'
copy-elisionoptimisation désactivante , le compilateur échouera? Je vous remercie.