2012-05-15 13 views
5

In gcc 4.2, questo funziona:Xcode/LLVM clausola catch non soddisfano tipi derivati ​​

#include <stdexcept> 
#include <iostream> 

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

In Xcode 4.3.2 (IOS con LLVM 3.1, -std = C++ 11), questo non riesce con terminate called throwing an exception , senza mai raggiungere la linea 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); 
} 

Ma questo funziona:

#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); 
} 

Che cosa dà?

+0

togliere la 'const' e dicci cosa ottieni –

+0

@MarkRansom: nessuna modifica. Ho provato a '... catch (std :: exception ex) ...' di nuovo, nessun cambiamento. –

risposta

2

gcc è corretto:

15.3p3 Un gestore è una partita per un oggetto eccezione di tipo E se

  • ... o
  • il gestore è di digitare cvT o cvT& e T è una classe univoca pubblica base E o
  • ...

Questo suona come un bug di Xcode (e una sorpresa di base!)

+0

Grazie per la modifica @Heatsink. Quindi in realtà puoi mettere una lista in una citazione, e ora penso di vedere come. – aschepler

Problemi correlati