Stavo sperimentando gli operatori di sovraccarico new
e delete
e ho notato che MSVC e GCC sembrano differire nella loro implementazione di operator delete
. Si consideri il seguente codice:L'overload dell'operatore sovraccarico può avere parametri predefiniti?
#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;
Questo codice verrà compilato correttamente con GCC (testato sia con Ideone e TutorialsPoint compilatori on-line), ma non con MSVC (testato con MSVS 2010 MSVS 2015 on-line, e Rextester).
Mentre sembra che GCC lo compili come ci si aspetterebbe, MSVC emette l'errore C2831; Ho controllato Cppreference, ma non sono riuscito a trovare una risposta; la pagina default parameter non menziona gli operatori e le pagine non menzionano i parametri predefiniti. Analogamente, la voce Overloading new
and delete
nelle Domande frequenti su SO C++ non menziona i parametri predefiniti.
Quindi, alla luce di ciò, quale di questi comportamenti (consentendo i parametri predefiniti o considerandoli come un errore) è conforme allo standard C++?
vicini:
Grazie, è utile sapere. Non pensavo di controllare direttamente lo standard. –
Quindi questo è un bug di gcc (il compilatore dovrebbe emettere una diagnostica), se OP stava compilando in modalità standard. –
@MM Dopo averlo menzionato, l'ho provato con 'g ++ -c -std = C++ 11 main.cpp',' g ++ -c -std = C++ 1y main.cpp', e 'g ++ -c -std = C++ 1y -Wall -pedantic-errors main.cpp' su TutorialsPoint (che usa 'gcc versione 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)' per l'ambiente online), e ancora compilato. Non sono sicuro che ci sia un modo per forzare una conformità standard più severa, non sono così familiare con GCC. –