5

私はオペレータnewdeleteをオーバーロードして実験していましたが、MSVCとGCCはoperator deleteの実装が異なっているようです。次のコードを考えてみましょう:オーバーロードされた演算子deleteにデフォルトのパラメータがありますか?

#include <cstddef> 

struct CL { 
    // The bool does nothing, other than making these placement overloads. 
    void* operator new(size_t s, bool b = true); 
    void operator delete(void* o, bool b = true); 
}; 
// Functions are simple wrappers for the normal operators. 
void* CL::operator new(size_t s, bool b) { return ::operator new(s); } 
void CL::operator delete(void* o, bool b) { return ::operator delete(o); } 

auto aut = new (false) CL; 

このコードは、MSVC(オンラインMSVS 2010、MSVS 2015でテストし、Rextester)とGCC(IdeoneとTutorialsPoint両方オンラインのコンパイラでテスト)で正常にコンパイルしませんが。

GCCが予想通りにコンパイルするようですが、MSVCはエラーC2831を出力します。私はCppreferenceをチェックしましたが、答えが見つかりませんでした。 default parameterページには演算子はなく、operator overloading & operator deleteページにはデフォルトパラメータは記載されていません。同様に、SOのC++ FAQのOverloading new and deleteエントリには、デフォルトのパラメータは記載されていません。

したがって、これらの動作(デフォルトパラメータを許可するか、エラーとして扱うか)はC++標準に準拠していますか?

リンク:

答えて

8

オペレータ機能は、明示的に下記の場合を除いて、デフォルト引数(8.3.6)を持つことができません。

(C++ 14標準、[over.oper]/8;同一の文がC++ 03標準に現れる)。

デフォルトの引数が許可される特定のケースは、関数呼び出し演算子(operator(); [over.call]/1参照)の場合です。他のすべての場合、それらは許可されない。

+0

ありがとう、それは知っていると便利です。私は標準を直接チェックするとは思わなかった。 –

+0

OPが標準モードでコンパイルされていた場合、これはgccのバグです(コンパイラは診断を発行する必要があります)。 –

+0

@MMあなたがそれを述べた後、私は 'g ++ -c -std = C++ 11 main.cpp'、' g ++ -c -std = C++ 1y main.cpp'、 'g ++ -c TutorialsPoint(オンライン環境では 'gcc version 5.3.1 20151207(Red Hat 5.3.1-2)(GCC)'を使います)で-std = C++ 1y -Wall -pedantic-errors main.cpp'を実行します。まだコンパイルされています。より厳格な標準への準拠を強制する方法があるかどうかはわかりませんが、私はGCCをよく知っているわけではありません。 –

関連する問題