Оператор Constexpr новый

Можно ли перегрузить оператор, чтобы быть новой функцией constexpr? Что-то вроде:

constexpr void * operator new( std::size_t count );

Причиной является выполнение функции constexpr в перегруженном теле оператора, где значение аргумента count будет входными данными... Поскольку оператор вызывается:

SomeClass * foo = new SomeClass(); 

Размер типа данных известен во время компиляции, не так ли? (count== sizeof(SomeClass)) То есть счет можно считать постоянной времени компиляции?

constexpr void * operator new( std::size_t count )
{
  if constexpr ( count >= 10 ) { /* do some compile-time bussiness */ }
}

Заранее большое спасибо всем, кто хочет помочь!

1 ответ

Вы не можете перегрузить оператора new быть constexpr, основная проблема связана со стандартной директивой C++ §9.1.5/1. constexpr спецификатор [dcl.constexpr] (выделение рудника):

constexpr спецификатор должен применяться только к определению переменной или шаблона переменной или объявлению функции или шаблона функции. Функция или член статических данных, объявленные с constexpr Спецификатор неявно является встроенной функцией или переменной (9.1.6). Если какое-либо объявление функции или шаблона функции имеет constexpr спецификатор, то все его объявления должны содержать constexpr спецификатор

То есть для того, чтобы перегрузить оператор new все его предыдущие декларации также должны быть constexpr что они не являются и, следовательно, перегружают его как constexpr Вы получаете ошибку времени компиляции.

Другие вопросы по тегам