2016-05-23 36 views
5

I eksperymentował z przeciążenia operatorów new i delete, i zauważyłem, że MSVC i GCC pojawiają się różnić w ich realizacji operator delete. Rozważmy następujący kod:Czy przeciążony operator delete ma domyślne parametry?

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

Ten kod zostanie skompilowany poprawnie z GCC (testowane zarówno Ideone i TutorialsPoint kompilatorów online), ale nie z MSVC (testowane z MSVS 2010 MSVS 2015 online, a Rextester).

Chociaż wydaje się, że GCC kompiluje go, jak można by się spodziewać, MSVC emituje błąd C2831; Sprawdziłem Cppreference, ale nie mogłem znaleźć odpowiedzi; strona default parameter nie wspomina operatorów, a operator overloading & operator delete strony nie wspominając parametry domyślne. Podobnie, wpis Overloading new and delete w FAQ C++ SO nie wspomina o parametrach domyślnych.

Zatem, w świetle tego, które z tych zachowań (pozwalając na domyślne parametry lub traktując je jako błąd) jest zgodne ze standardem C++?

Linki:

Odpowiedz

8

Funkcja operator nie może mieć domyślne argumenty (8.3.6), z wyjątkiem sytuacji wyraźnie określonych poniżej.

(Standard C++ 14, [nad.oper]/8, identyczne zdanie pojawia się w standardzie C++ 03).

Przypadkiem, w którym dozwolone są domyślne argumenty, jest przypadek operatora wywołania funkcji (operator(); patrz [nadmiar]/1). We wszystkich innych przypadkach są one niedozwolone.

+0

Dzięki, to warto wiedzieć. Nie myślałem, żeby sprawdzić standard bezpośrednio. –

+0

Więc jest to błąd gcc (kompilator powinien wydać diagnostyczny), jeśli OP został kompilacji w trybie standardowym. –

+0

@MM Po wspomnianiu, wypróbowałem go zarówno z 'g ++ -c -std = C++ 11 main.cpp',' g ++ -c -std = C++ 1y main.cpp' oraz 'g ++ -c -std = C++ 1y -Wall -pedantic-errors main.cpp' na TutorialsPoint (który używa 'gcc wersji 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)' dla środowiska online), i nadal kompilowane. Nie jestem pewien, czy istnieje sposób na wprowadzenie bardziej rygorystycznej zgodności ze standardami, nie jestem zaznajomiony z GCC. –