2014-10-08 9 views
8

dla następującego kodufunkcja-try-bloku i noexcept

struct X 
{ 
    int x; 
    X() noexcept try : x(0) 
    { 
    } 
    catch(...) 
    { 
    } 
}; 

Visual Studio 14 CTP emituje ostrzeżenie

ostrzeżenie C4297: 'X :: X': nie funkcja przyjmuje się rzucić wyjątkiem ale robi

uwaga: __declspec (nothrow), rzut(), noexcept (prawda) lub noexcept został określono funkcję

Czy to niewłaściwe użycie noexcept? Czy jest to błąd w kompilatorze Microsoft?

Odpowiedz

11

Czy jest to błąd w kompilatorze firmy Microsoft?

Niezupełnie.

Tak zwany blok funkcyjny, taki jak ten, nie może zapobiec sytuacji, w której wyjątek wyjdzie na zewnątrz. Należy wziąć pod uwagę, że obiekt nie jest nigdy w pełni skonstruowany, ponieważ konstruktor nie może zakończyć wykonywania. catch -blok musi rzut coś innego lub prąd wyjątek nie zostanie rethrown ([except.handle]/15):

aktualnie obsługiwane wyjątku rethrown Jeśli kontrola osiągnie koniec procedury obsługi w function-try-block konstruktora lub destruktora .

Dlatego kompilator wnioskuje, że konstruktor rzeczywiście może rzucić.

struct X 
{ 
    int x; 
    X() noexcept : x(0) 
    { 
     try 
     { 
      // Code that may actually throw 
     } 
     catch(...) 
     { 
     } 
    } 
}; 

Należy kompilować bez ostrzeżenia.

Powiązane problemy