Constexpr если с не булевым состоянием - PullRequest
0 голосов
/ 27 февраля 2019

Кажется, я нашел то, с чем не согласны 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, но я не совсем уверен.Если это ошибка с любым из компиляторов, о ней уже сообщалось?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

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

Clang верен.

0 голосов
/ 27 февраля 2019

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

[stmt.if] (выделено мной)

2 Если оператор ifимеет форму, если constexpr, значение условия должно быть контекстно-преобразованным константным выражением типа bool ;эта форма называется оператором constexpr if.

[expr.const]

4 Преобразованное константное выражение типа T является выражением,неявно преобразуется в тип T, где преобразованное выражение является константным выражением, а последовательность неявных преобразований содержит только

  • целочисленных преобразований, кроме сужающих преобразований,

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

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


1 - И существует предложение изменить его .

...