これは完全に有効なコードであるため、コンパイラは診断を発行する必要はありませんが、この場合は診断が役立ちます。これは、多くの開発者が好む理由の 1 つです。なぜなら、彼らは診断に関して必要以上のことclang
をする傾向があるからです。
診断メッセージに関する標準ルールについては、ドラフト C++ 標準セクションの1.4
実装コンプライアンスに移動できます (強調鉱山):
診断可能な規則のセットは、この国際標準のすべての構文規則と意味規則で構成されます。ただし、「診断は必要ありません」という明示的な表記を含む規則、または「未定義の動作」をもたらすと記述されている規則は除きます。</p>
この国際標準は C++ 実装に関する要件のみを述べていますが、それらの要件は、プログラム、プログラムの一部、またはプログラムの実行に関する要件として表現されている場合、理解しやすいことがよくあります。このような要件には、次の意味があります。
プログラムにこの国際標準の規則違反が含まれていない場合、適合する実装は、そのリソース制限内で、そのプログラムを受け入れて正しく実行する必要があります。
実装がその構成をサポートしていないときに、プログラムが診断可能な規則の違反、またはこの標準で「条件付きでサポートされる」と記述されている構成の発生を含む場合、適合する実装は少なくとも 1 つの診断メッセージを発行するものとします。
プログラムに診断が不要な規則違反が含まれる場合、この国際規格はそのプログラムに関する実装に要件を課しません。
このプログラムは構文上または意味上の規則に違反していないため、診断は必要ありません。
次のコードがあります。
if (some_condition) (p1, p2, color);
^ ^ ^
1 2 3
1
このコンテキストで有効な式ステートメント for およびifステートメントです。これは、文法を見ればわかります。
if ( condition ) statement
と:
statement:
attribute-specifier-seqopt expression-statement
と:
expression-statement:
expressionopt;
と:
primary-expression:
( expression )
2
と3
は両方とも、左のオペランドを評価して値を破棄し、右のオペランドを再度評価するコンマ演算子です。ここでは無効ではありません。
では、セクション5.18
コンマ演算子は次のように言っています。
コンマで区切られた式のペアは、左から右に評価されます。左の式は破棄された値の式です (箇条 5)。83
破棄された値式は、次のセクション5
で説明されています。
一部のコンテキストでは、式はその副作用のためにのみ表示されます。このような式は、破棄値式と呼ばれます。
したがって、左側の式の結果の値は破棄されるため、副作用のみを気にする必要があります。あなたの特定のケースでは、変数を評価しても、値を生成する以外に他の効果はないため、警告が表示されますが、代わりに関数を使用した場合は、次のようになります。
bool func()
{
//...
}
コードを次のように変更します。
if (some_condition) (func(), func(), func() );
おそらくあなたが気にかけているいくつかの副作用を実行するので、どちらclang
もgcc
警告も提供しません。func