Como sé std::allocator<T>::construct
, solo toma dos parámetros en la versión anterior de C ++; el primero es un puntero a la memoria sin construir, en bruto, en la que queremos construir un objeto de tipo T
y el segundo es un valor de tipo de elemento para inicializar ese objeto. Entonces se invoca el constructor de 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;
}
¿Por qué en C ++ 98
a.construct(p, 10)
llamando al constructor de copia pero en C ++ 11 y superior está llamando solo al constructor que toma un entero?¿Quiere decir esto en C ++ 11 debido a una optimización de copia-elisión incluso si el constructor
Foo(int)
esexplicit
obras en dicha llamada:a.construct(p, 5)
obras en C ++ 11 incluso el constructor esexplicit
lo que estoy seguro es de que no funciona en C ++ 98 siFoo(int)
esexplicit
.Si es así, si compilo esa declaración con algún tipo de
copy-elision
optimización de desactivación, ¿ hará que falle el compilador? Gracias.