2016-05-23 13 views
5

Ich experimentierte mit dem Überladen der Operatoren new und delete und bemerkte, dass MSVC und GCC sich in ihrer Implementierung von operator delete zu unterscheiden scheinen. Betrachten Sie den folgenden Code ein:Kann der überladene Operator löschen Standardparameter haben?

#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; 

Dieser Code kompiliert richtig mit GCC (getestet mit sowohl Ideone und TutorialsPoint Online-Compiler), aber nicht mit MSVC (getestet mit MSVS 2010 MSVS 2015 online, und Rextester).

Während es scheint, dass GCC es kompiliert, wie man erwarten würde, gibt MSVC Fehler C2831 aus; Ich habe Cppreference überprüft, konnte aber keine Antwort finden; die default parameter Seite erwähnt keine Operatoren, und die operator overloading & operator delete Seiten erwähnen keine Standardparameter. In ähnlicher Weise erwähnt der Overloading new and delete Eintrag in SO C++ FAQ Standardparameter nicht.

In Anbetracht dessen, welches der folgenden Verhaltensweisen (das Zulassen von Standardparametern oder deren Behandlung als Fehler) entspricht dem C++ - Standard?

Links:

Antwort

8

Ein Operator Funktion Standardargumente nicht (8.3.6) haben können, sofern unten explizit angegeben.

(C++ 14 Standard, [over.oper]/8; ein identischer Satz erscheint im C++ 03 Standard).

Der spezielle Fall, in dem Standardargumente zulässig sind, ist der Fall des Funktionsaufrufoperators (operator(); siehe [over.call]/1). In allen anderen Fällen sind sie nicht erlaubt.

+0

Danke, das ist nützlich zu wissen. Ich dachte nicht daran, den Standard direkt zu überprüfen. –

+0

Das ist also ein GCC-Bug (der Compiler sollte eine Diagnose ausgeben), wenn OP im Standard-Modus kompiliert wurde. –

+0

@MM Nachdem du es erwähnt hast, habe ich es mit 'g ++ -c -std = C++ 11 main.cpp',' g ++ -c -std = C++ 1y main.cpp' und 'g ++ -c versucht -std = C++ 1y -Wall -pedantic-Fehler main.cpp auf TutorialsPoint (die 'gcc Version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)' für die Online-Umgebung verwendet), und es noch kompiliert. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, die Einhaltung strengerer Normen zu erzwingen, ich kenne mich mit GCC nicht aus. –

Verwandte Themen