「ifconstexpr」のfalseブランチがコンパイルされるのはなぜですか?

Aug 18 2020

コンパイル中にこのコードでエラーが発生するのはなぜですか?「」に関する私の知識(およびこれも)if constexprは、elseブロックをコンパイルすべきではないと言っています。

if constexpr (true) {
    int a = 10;
} else {
    int b = 10
}

エラーは次のとおりです。

error: expected ‘,’ or ‘;’ before ‘}’ token

使用したコンパイラ:g ++バージョン7.5.0
コンパイル中に-std=c++17フラグを使用しました。

PS不足している ';' elseコンパイルされているかどうかを確認するためだけに、意図的に作成されています。

回答

7 cigien Aug 18 2020 at 20:13

ここには2つの別個の、しかし関連する問題があります。

まず、if constexprテンプレート内のブランチを条件付きでコンパイルするだけです。テンプレートの外では、すべてのブランチがコンパイルされ、適切に形成されている必要があります。

第2に、テンプレートであっても、の破棄されたブランチは、if constexpr考えられるすべてのインスタンス化に対して不正な形式になることはありません。次の理由から、これはコードには当てはまりません。

int b = 10

常に形式が正しくありません(欠落しているため;)。

したがって、コンパイラはコンパイルエラーを出すのに正しいです。技術的には、破棄されたブランチがすべてのインスタンス化で不正な形式である場合、コンパイラはコンパイラエラーを出す必要はありませんが、コードはまだ間違っています。