2016-08-28 2 views
8

このコードが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); 

答えて

4

C++ 11以降を使用していますか?

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(); 

で元オペレータ新しい()宣言はnoexceptキーワードを使用するC++ 11に変更されました:

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

'-std = C++ 03'を追加することによって、g ++はうまくコンパイルされます。しかし、なぜこのエラーメッセージが表示されるのか説明していません。 'wtf.cpp'の3行目には、4行目と同じ例外指定子があります。 – BigDawg

+0

@BigDawg - 'throw()'と 'noexcept'も同様の効果を持ちますが、' throw(std :: bad_alloc) 'はスローされた例外を指定しないこととまったく異なります。 –

1

GCC 6では、C++のデフォルトモードはchangedからC++ 14GCC5まではC++ 98でした。

operator newの宣言は、C++ 11ではわずかに変更されています。

  • throw (std::bad_alloc)が後方ベストnothrow

に置き換えられ

  • throw()
  • が省略されている:それは投げる例外仕様が deprecated in C++11であるという事実、そして nothrow宣言の導入に関係しています-compatibility -std引数を使用して、ターゲットとするC++標準を指定する必要があります。

    $ g++-6 -std=c++98 wtf.cpp -c 
    
    関連する問題