警告 C6395

%variable% には、C++17 より前にシーケンスされていない読み取りまたは書き込みがあります。言語標準を変更すると、コードの動作が変わる可能性があります。

解説

C++17 では、特定の式の評価順序がより厳密になりました。 MSVC が準拠しており、一部の式の評価順序が変更されました。 したがって、言語バージョンを変更すると、プログラムの監視可能な動作が変更される可能性があります。 このチェックでは、言語バージョンの切り替えによってコードの意味が変わるケースの一部を診断します。

コード分析名: EVAL_ORDER_CHANGE

void foo(int* a, int i)
{
    a[++i] = i; // Warning: 'i' has unsequenced reads and/or writes before C++17; changing the language standard might change the behavior of the code
}

この問題を解決するには、式の残りの部分から副作用を分離して、評価順序を適切に定義します。

void foo(int* a, int i)
{
    ++i;
    a[i] = i; // No warning.
}