Все компиляторы ведут себя правильно.
Ваша программа плохо сформирована, диагностика не требуется c требуется , поскольку вы используете odr Struct<true>::printIfFalse
через экземпляр Struct<true>::print()
требуется от звонка в withTrue.print();
. Функция, которая используется odr за пределами отброшенного оператора , должна иметь определение в программе, см. [basi c .def.odr] / 4 , в противном случае программа неправильно сформирован, диагностика не требуется c требуется .
A исключенное утверждение - это то, что вы получите, если вы используете if constexpr
в шаблоне, а утверждение не является в выбранной ветке. Итак, что вы можете сделать, чтобы сделать программу правильно сформированной, это использовать if constexpr
вместо if
. Это функция C ++ 17.