Me he encontrado con un problema de excepciones que no está claro para mí. En C++, cuando se lanza un objeto, primero se copia a un objeto temporal, y el objeto temporal se pasa luego al código de captura. La copia implica el uso del constructor de copia de clase del objeto. AFAIK, esto significa que si una clase tiene un constructor de copia privada, no se puede usar como una excepción. Sin embargo, en VS2010, el siguiente código se compila y ejecuta:¿Se pueden lanzar objetos con constructores de copia privada?
class Except
{
Except(const Except& other) { i = 2; }
public:
int i;
Except() : i(1) {}
};
int main()
{
try
{
Except ex1;
throw ex1; // private copy constructor is invoked
}
catch (Except& ex2)
{
assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2
}
return 0;
}
¿Es esto legal?
Trate de añadir las impresiones o depuración y ver el orden de las llamadas, tal vez las cosas no se ejecutan exactamente como crees que lo hacen. – selalerer
Obtengo el mismo comportamiento con VS2010 pero falla [aquí] (http://ideone.com/RlOjl) con gcc v4.3.4. – hmjd
Podría ser que el objeto temporal sea lo que se construye y la copia se optimice. Similar a la optimización del valor de retorno. –