Оператор 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
Вы получаете ошибку времени компиляции.