2016-08-28 25 views
8

mógłby ktoś wytłumaczyć mi, dlaczego ten kod nie skompilować z g ++ w wersji 6.2.0, ale kompiluje grzywny z brzękiem ++ Wersja 3.9.0-svn274438-1 i ICPC 16.0.2Different specifier wyjątek z g ++ 6.2

$ cat wtf.cpp 
#include <cstdio> 
#include <new> 
void *operator new(std::size_t) throw(std::bad_alloc); 
void *operator new(std::size_t) throw (std::bad_alloc) { void *p; return p; } 

$ g++-6 wtf.cpp -c 
wtf.cpp: In function ‘void* operator new(std::size_t)’: 
wtf.cpp:4:7: error: declaration of ‘void* operator new(std::size_t) throw (std::bad_alloc)’ has a different exception specifier 
void *operator new(std::size_t) throw (std::bad_alloc) { void * p; return p; } 
     ^~~~~~~~ 
wtf.cpp:3:7: note: from previous declaration ‘void* operator new(std::size_t)’ 
void *operator new(std::size_t) throw(std::bad_alloc); 

Odpowiedz

4

Czy używasz C++ 11 lub nowszego?

Oryginalny operator new() deklaracje w C++ 98

throwing: 
void* operator new (std::size_t size) throw (std::bad_alloc); 

nothrow: 
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw(); 

placement: 
void* operator new (std::size_t size, void* ptr) throw(); 

zostały zmienione w C++ 11 użyć noexcept kluczowe:

throwing: 
void* operator new (std::size_t size); 

nothrow:  
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept; 

placement: 
void* operator new (std::size_t size, void* ptr) noexcept; 

Reference link.

+0

Dodając '-std = C++ 03', g ++ kompiluje się dobrze. Ale to nie wyjaśnia, dlaczego dostaję ten komunikat o błędzie, prawda? Linia 3 'wtf.cpp' nadal ma ten sam specyfikator wyjątków co linia 4. Myślę, że. – BigDawg

+0

@BigDawg - 'throw()' i 'noexcept' mają podobny efekt, ale' throw (std :: bad_alloc) 'jest całkowicie odmienny od nieokreślania wyrzucanych wyjątków. –

1

W GCC 6 domyślny tryb dla C++ ma changed na C++ 14. Do GCC 5 był to C++ 98.

Deklaracja operator new zmieniła się nieznacznie w C++ 11. Ma to związek z faktem, że specyfikacja wyjątek rzucanie jest deprecated in C++11 i wprowadzenia deklaracji nothrow:

  • throw (std::bad_alloc) został pominięty
  • throw() otrzymuje z nothrow

Dla najlepiej wstecznej - Kompatybilność należy określić, który standard C++ jest kierowany za pomocą argumentu -std, na przykład:

$ g++-6 -std=c++98 wtf.cpp -c