为什么在不同的行上调用函数会改变 C++ 中的结果?

Why does calling a function on seperate lines change the result in c++?

似乎出于某种原因,当我尝试在同一行调用两个函数时,第一个函数从“.get()”接收一个 nullptr 作为第一个参数

getSomePtr(someUniquePtr.get(), someArray)->moveUniquePtr(std::move(someUniquePtr));

但是当将这些函数分成两行时,一切似乎都有效:

auto* somePtr = getSomePtr(someUniquePtr.get(), someArray);
somePtr->moveUniquePtr(std::move(someUniquePtr));

为什么会这样?

计算表达式时,先计算函数参数,然后调用采用这些参数的函数。

但是,在该规则之外,编译器可以选择求值顺序。看起来,在您的第一种情况下,它选择在评估 someUniquePointer.get() 之前评估 moveUniquePtr。因为一个子表达式修改了另一个子表达式中使用的状态,所以整个表达式的结果没有明确定义。

将表达式拆分为顺序语句,如您的第二种情况,明确选择求值顺序,在这种情况下是正确的做法。