Существует список вещей , которые не позволяют выражению считаться основным константным выражением.
Одна из вещей, которую вы не можете сделать, это оценить:
this
, за исключением функции constexpr или конструктора constexpr, который оценивается как часть e
;
В f()
мы оцениваем this
, чтобы увидеть, что такое x.pred
(потому что на самом деле это this->x.pred
), но f()
не является функцией constexpr. Таким образом, этот пункт исключает c.f()
. Если бы f()
были constexpr
, то это скомпилировалось бы.
В f2()
мы нигде не оцениваем this
, поэтому пул не применяется. Мы выполняем преобразование lvalue в rvalue, но оно ссылается на завершенный энергонезависимый объект const с предшествующей инициализацией, инициализированной константным выражением . Ничто другое не относится. Так что все в порядке.