警告 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.
}