私はオペレータnew
とdelete
をオーバーロードして実験していましたが、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++標準に準拠していますか?
リンク:
ありがとう、それは知っていると便利です。私は標準を直接チェックするとは思わなかった。 –
OPが標準モードでコンパイルされていた場合、これはgccのバグです(コンパイラは診断を発行する必要があります)。 –
@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をよく知っているわけではありません。 –