このコードがg ++バージョン6.2.0でコンパイルされず、clang ++バージョン3.9.0-svn274438-1とicpcバージョン16.0.2でコンパイルされた理由を誰かが説明できますか?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);
'-std = C++ 03'を追加することによって、g ++はうまくコンパイルされます。しかし、なぜこのエラーメッセージが表示されるのか説明していません。 'wtf.cpp'の3行目には、4行目と同じ例外指定子があります。 – BigDawg
@BigDawg - 'throw()'と 'noexcept'も同様の効果を持ちますが、' throw(std :: bad_alloc) 'はスローされた例外を指定しないこととまったく異なります。 –