Come so, std::allocator<T>::construct
accetta solo due parametri nella versione precedente di C ++; il primo è un puntatore alla memoria grezza, non costruita in cui vogliamo costruire un oggetto di tipo T
e il secondo è un valore di tipo di elemento per inizializzare quell'oggetto. Quindi viene invocato il costruttore di copia:
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;
}
Perché su C ++ 98
a.construct(p, 10)
chiamando il costruttore di copie ma su C ++ 11 e versioni successive si chiama solo il costruttore che accetta un numero intero?Questo significa in C ++ 11 a causa di qualche ottimizzazione Copy-elisione anche se il costruttore
Foo(int)
èexplicit
lavori su tale chiamata:a.construct(p, 5)
opere in C ++ 11, anche il costruttore èexplicit
quello che sono sicuro è che non funziona su C ++ 98 seFoo(int)
lo èexplicit
.In tal caso, se compilo quell'istruzione con una sorta di disabilitazione
copy-elision
dell'ottimizzazione, il compilatore fallirà? Grazie.