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:
Dzięki, to warto wiedzieć. Nie myślałem, żeby sprawdzić standard bezpośrednio. –
Więc jest to błąd gcc (kompilator powinien wydać diagnostyczny), jeśli OP został kompilacji w trybie standardowym. –
@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. –