consteval контекста на if constexpr? Или так делается?
static_assert сломается?
Подробнее можно?
consteval void f(int i) { if (i); } Здесь нельзя заменить на if constexpr, потому что
Ну для consteval да, кажется противоестественным
Сделали так, как есть, чтобы не было например следующей ситуации: decltype(f(1)) != decltype(f(2))
Я видел уже несколько объяснений этой логики в этом и procxx чатах
@oficsu , возможно у тебя под рукой есть ссылка на твоё объяснение
Спасибо, попробую погрепать по чатам, если что
Всё дело вот в чём. Представим такую функцию: consteval auto f(int i) { if constexpr (i == 42) { return Foo{}; } else { return Bar{}; } } Она, как мы видим, не шаблон. Какой тип вернёт decltype(f)? Как с ней работать теперь, когда даже std::invoke_result сломан?
А. То есть параметр в отличие от шаблона не создаёт отдельную сущность, потому запретили?
Да, мы в принципе можем сделать сейчас что-то такое в unevaluated context: decltype(f(std::declval<int>())) Идея в том, что все инты одинаковы, а потому мы можем судить о свойствах функции без конкретного значения. Это вообще одна из основ языка. Но если consteval... Без сомнения, так можно сделать, но, вероятно, к вопросу, что ломать, а что нет, стоит подойти позже и более сознательно Да и дело не в том, что запретили, а в том, что для того, чтобы разрешить такое поведение, потребуется много чего добавить или изменить в стандарте
а никто не делал пропозал чтобы эта идея была высечена в камне (чтобы можно было следить)?
Есть пропозалы по рефлексии, которые в качестве примеров приводили код, который именно так и должен работать по смыслу: consteval void f(std::meta::info i) requires std::meta::is_class(i) { /* ... */ } Но никакой формализации или вординга там не было. Более того, было решение в следующих бумагах по рефлексии так не делать
Обсуждают сегодня