Почему работает new в шаблонной constexpr функции

Есть шаблон функции, помеченный constexpr

template <class T>
constexpr auto foo() {
   return new int;
}

Вопрос: почему это работает? Стоить убрать шаблон и все (вполне закономерно, ведь new не может быть constexpr) перестает работать с ошибкой, что new не может быть вычислено на этапе компиляции


Ответы (2 шт):

Автор решения: αλεχολυτ

С шаблоном работает по той причине, что у шаблона функции могут быть специализации. Специализации при этом обязаны тоже быть constexpr, однако, тело у них может быть совершенно иным, т.е. не содержать чего-то неподходящего для constexpr, в данном случае new.

→ Ссылка
Автор решения: user7860670

Этот код не работает. new в constexpr разрешен только с С++20, и только при условии, что:

  1. используется глобальная функция аллокации (тут соблюдено)
  2. выделенная память освобождается там же (не соблюдено)
→ Ссылка