Оператор Constexpr новый - PullRequest
0 голосов
/ 21 ноября 2018

Возможно ли перегрузить оператор, чтобы он был функцией 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 business */ }
}

Большое спасибо всем, кто готов помочь!

1 Ответ

0 голосов
/ 21 ноября 2018

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

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

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

...