2012-05-15 18 views
5

En gcc 4.2, esto funciona:Xcode/LLVM cláusula catch que no coincida con los tipos derivados

#include <stdexcept> 
#include <iostream> 

int main() { 
    try { 
     throw std::runtime_error("abc"); 
    } catch (const std::exception& ex) { 
     std::cout << ex.what(); 
    } 
} 

En Xcode 4.3.2 (iOS con LLVM 3.1, -std = C++ 11), esta falla con terminate called throwing an exception , sin llegar nunca a la línea NSLog(…):

#include <stdexcept> 

int main() { 
    try { 
     throw std::runtime_error("abc"); 
    } catch (const std::exception& ex) { 
     NSLog(@"%s", ex.what()); 
    } 

    return UIApplicationMain(argc, argv, nil, nil); 
} 

Pero esto funciona:

#include <stdexcept> 

int main() { 
    try { 
     throw std::runtime_error("abc"); 
    } catch (const std::runtime_error& ex) { 
     NSLog(@"%s", ex.what()); 
    } 

    return UIApplicationMain(argc, argv, nil, nil); 
} 

lo que da?

+0

sacar la 'const' y dinos lo que obtienes. –

+0

@MarkRansom: Sin cambios. Intenté '... catch (std :: exception ex) ...' también; de nuevo, sin cambios. –

Respuesta

2

gcc es correcta:

15.3p3 Un manejador es a la altura de un objeto excepción de tipo E si

  • ... o
  • el manejador es de tipo cvT o cvT& y T es una clase pública inequívoca base del E, o
  • ...

Esto suena como un error de Xcode (y uno sorprendentemente básico!)

+0

Gracias por editar @Heatsink. Entonces puedes poner una lista en una cita, y ahora creo que veo cómo. – aschepler

Cuestiones relacionadas