Constexpr, если с небулевым условием

Кажется, я нашел кое-что, с чем расходятся Clang и GCC. Вот код:

int main() {
  if constexpr (2) {}
}

Это успешно компилируется с GCC 7.4.0, но не работает с Clang 7.0.0 с этим сообщением об ошибке:

test.cpp:3:17: error: constexpr if condition evaluates to 2, which cannot be narrowed to type 'bool'
      [-Wc++11-narrowing]
  if constexpr (2) {}
                ^
1 error generated.

cppreference, похоже, не упоминает «сужение», так что это похоже на ошибку Clang, но я не совсем уверен. Если это ошибка одного из компиляторов, о ней уже сообщалось?

Что, если вы сделаете if constexpr (!!2) {}?

Jesper Juhl 27.02.2019 07:48

(!!2) будет работать, но 2 тоже должно работать.

ivan.ukr 27.02.2019 07:49

Я только что проверил. !!2 работает с лязгом

Indiana Kernick 27.02.2019 07:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
42
4
2 073
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Clang проводит диагностику по этим параграфам

[stmt.if] (emphasis mine)

2 If the if statement is of the form if constexpr, the value of the condition shall be a contextually converted constant expression of type bool; this form is called a constexpr if statement.

[expr.const]

4 A converted constant expression of type T is an expression, implicitly converted to type T, where the converted expression is a constant expression and the implicit conversion sequence contains only

  • integral conversions other than narrowing conversions,

Теперь, когда дело доходит до интегральных преобразований, преобразование кboolуказан как интегральное преобразование. И это сужение в самом строгом смысле этого слова, поскольку логическое значение не может представлять все значения int. Так что диагностика не без оснований.

Но я также думаю, что вполне разумно учитывать тот факт, что преобразование в bool обычно предназначено для проверки «правдивости», поэтому его сужающий характер не должен иметь значения. Это похоже на незначительную ошибку в стандарте1, когда GCC идет по пути здравого смысла, а Clang придерживается сухой буквы закона в самом строгом смысле.


1 - And a proposal exists to change it.

Ошибка в стандарте! ржу не могу

Indiana Kernick 27.02.2019 07:57

@ Rakete1111 - беззастенчиво добавил к ответу :) Спасибо!

StoryTeller - Unslander Monica 27.02.2019 08:53

Мы говорим это, но это скрыто. «Контекстно преобразованное константное выражение типа bool» — это стандартный термин, исключающий сужающие преобразования.

Кланг прав.

Согласилась ли CWG с тем, что текущая формулировка стандарта является предполагаемой?

Language Lawyer 27.02.2019 13:46

Другие вопросы по теме