2016-05-23 36 views
5

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:

risposta

8

Una funzione operatore non può avere argomenti di default (8.3.6), tranne quando espressamente indicato di seguito.

(C++ 14 standard, [over.oper]/8; una frase identica viene visualizzata nello standard C++ 03).

Il caso specifico in cui sono consentiti argomenti predefiniti è il caso dell'operatore di chiamata di funzione (operator(); vedere [over.call]/1). In tutti gli altri casi non sono consentiti.

+0

Grazie, è utile sapere. Non pensavo di controllare direttamente lo standard. –

+0

Quindi questo è un bug di gcc (il compilatore dovrebbe emettere una diagnostica), se OP stava compilando in modalità standard. –

+0

@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. –