「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
常に形式が正しくありません(欠落しているため;
)。
したがって、コンパイラはコンパイルエラーを出すのに正しいです。技術的には、破棄されたブランチがすべてのインスタンス化で不正な形式である場合、コンパイラはコンパイラエラーを出す必要はありませんが、コードはまだ間違っています。