5

Я экспериментировал с операторами перегрузки 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++?

Ссылки:

ответ

8

Функция оператор не может иметь аргументы по умолчанию (8.3.6), за исключением того, где явно указано ниже.

(стандарт C++ 14, [over.oper]/8, идентичное предложение появляется в стандарте C++ 03).

Конкретный случай, когда допустимы аргументы по умолчанию, относится к оператору вызова функции (operator(); см. [Over.call]/1). Во всех остальных случаях они запрещены.

+0

Спасибо, это полезно знать. Я не думал напрямую проверять этот стандарт. –

+0

Итак, это ошибка gcc (компилятор должен выдать диагностику), если OP компилировался в стандартном режиме. –

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^