Я экспериментировал с операторами перегрузки new
и delete
и заметил, что MSVC и GCC, по-видимому, отличаются по своей реализации от operator delete
. Рассмотрим следующий код:Может ли перегруженный оператор удалить параметры по умолчанию?
#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;
Этот код будет компилировать правильно с GCC (протестированы с обоими Ideone и TutorialsPoint онлайн компиляторов), но не с MSVC (протестировано с МСВС 2010, МСВС 2015 онлайн, и Rextester).
Хотя представляется, что GCC компилирует его, как и следовало ожидать, MSVC испускает ошибку C2831; Я проверил Cppreference, но не смог найти ответа; страница default parameter не упоминает операторы, а страницы operator overloading & operator delete не содержат параметров по умолчанию. Аналогично, в записи Overloading new
and delete
в разделе «Часто задаваемые вопросы» на С ++ не указаны параметры по умолчанию.
Итак, с учетом этого, какое из этих действий (разрешая параметры по умолчанию или рассматривая их как ошибку) соответствует стандарту C++?
Ссылки:
Спасибо, это полезно знать. Я не думал напрямую проверять этот стандарт. –
Итак, это ошибка gcc (компилятор должен выдать диагностику), если OP компилировался в стандартном режиме. –
@MM После того, как вы упомянули об этом, я попробовал его с помощью 'g ++ -c -std = C++ 11 main.cpp',' g ++ -c -std = C++ 1y main.cpp' и 'g ++ -c -std = C++ 1y -Wall -pedantic-errors main.cpp' на TutorialsPoint (который использует 'gcc версию 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)' для онлайн-среды), и это все еще составлен. Не уверен, есть ли способ усилить стандартное соответствие, я не так хорошо знаком с GCC. –