Wie ich weiß, std::allocator<T>::constructwerden in älteren Versionen von C ++ nur zwei Parameter verwendet. Der erste ist ein Zeiger auf einen unkonstruierten Rohspeicher, in dem ein Objekt vom Typ erstellt werden soll, Tund der zweite ist ein Wert vom Elementtyp, um dieses Objekt zu initialisieren. Also wird der Kopierkonstruktor aufgerufen:
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;
}
Warum
a.construct(p, 10)ruft unter C ++ 98 der Kopierkonstruktor auf, unter C ++ 11 und höher jedoch nur der Konstruktor, der eine Ganzzahl akzeptiert?Bedeutet dies , dass auf C ++ 11 wegen einer Copy-elision Optimierung auch wenn der Konstruktor
Foo(int)sindexplicitWerke auf diesem Aufruf:a.construct(p, 5)Arbeiten auf C ++ 11 auch der Konstruktor ist ,explicitwas ich bin sicher, es ist nicht auf C nicht funktioniert ++ 98 , wennFoo(int)istexplicit.Wenn ja, wenn ich diese Anweisung mit einer Art Deaktivierungsoptimierung kompiliere,
copy-elisionführt dies dazu, dass der Compiler fehlschlägt? Vielen Dank.