web-dev-qa-db-ja.com

非ブール条件の場合の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のバグのように見えますが、完全に確実ではありません。これがいずれかのコンパイラのバグである場合、すでに報告されていますか?

42
Indiana Kernick

Clangはこれらの段落で診断しています

[stmt.if](鉱山を強調)

2 ifステートメントの形式がif constexpr、の場合、条件の値はbool型のコンテキスト変換された定数式になります。この形式はconstexpr ifステートメントと呼ばれます。

[expr.const]

4 T型の変換された定数式は、暗黙的にT型に変換された式です。変換された式は定数式であり、暗黙的な変換シーケンスには、

  • ナロー変換以外の積分変換、

さて、積分変換に関しては、変換tobool積分変換としてリストされています です。そして、それは狭義であり、Wordの厳密な意味では、boolはintのすべての値を表すことができないためです。したがって、診断には根拠がないわけではありません。

しかし、boolへの変換が通常は「真実性」をチェックすることを目的としているため、その狭窄の性質は問題にならないと考えることもかなり合理的だと思います。標準のマイナーなバグのようです1、GCCは常識的なルートを取り、Clangは厳密な意味で法のドライレターに準拠しています。


1 -そして それを変更する提案が存在します

私たちはそれを言いますが、それは隠されています。 「タイプboolのコンテキスト変換された定数式」は、ナローイング変換を除外する標準の用語です。

Clangは正しいです。

12
T.C.