проблем в gcc, но выдаёт ошибку в clang? Какое поведение является корректным с точки зрения стандарта? Почему в случае с clang шаблонная функция инстанцируется не смотря на то, что её вызов не должен произойти?
https://godbolt.org/z/Ev3vao5oT
static_assert(false) стреляет до инстанцирования, даже в коде, который никогда не инстанцируется (if constexpr(false) static_assert(false)) люди пользуются различными ухищрениями, чтобы перехитрить компилятор и заставить false "зависеть" от инстанцирования, типа template <typename> constexpr bool always_false = false; или static_assert(!sizeof(T*)) но формально это всё равно неправильно в C++23 это исправили, если включить clang trunk и поставить -std=c++23 то скомпилируется тоже
Там исправили сам if constexpr? Т.е. не будет, например, ошибок компиляции при вызове внутри then блока функций, которые не существуют с if constexpr (false) ?
так в этом и суть [p2593]
таки не вижу, чтобы починили https://godbolt.org/z/945WbfWE8
похоже, что если и чинили, то только сам static_assert, а не if constexpr
нет, if constexpr это не макросы, поэтому такой код вряд ли когда-то станет well-formed
ну, using Base = A<b> ... std::cout << Base::foo работает как надо
Не в C++23 исправили это. Там с бэкпортом в C++11 это сделали
строго говоря DR применяются к опубликованному на тот момент стандарту, но компиляторы довольно редко ограничивают действие DR конкретными языковыми режимами, и в этом случае тоже: https://godbolt.org/z/7f3TYYWK6
смешная табличка рядом с никнеймом
Обсуждают сегодня