为什么在不同的行上调用函数会改变 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
。因为一个子表达式修改了另一个子表达式中使用的状态,所以整个表达式的结果没有明确定义。
将表达式拆分为顺序语句,如您的第二种情况,明确选择求值顺序,在这种情况下是正确的做法。
似乎出于某种原因,当我尝试在同一行调用两个函数时,第一个函数从“.get()”接收一个 nullptr 作为第一个参数
getSomePtr(someUniquePtr.get(), someArray)->moveUniquePtr(std::move(someUniquePtr));
但是当将这些函数分成两行时,一切似乎都有效:
auto* somePtr = getSomePtr(someUniquePtr.get(), someArray);
somePtr->moveUniquePtr(std::move(someUniquePtr));
为什么会这样?
计算表达式时,先计算函数参数,然后调用采用这些参数的函数。
但是,在该规则之外,编译器可以选择求值顺序。看起来,在您的第一种情况下,它选择在评估 someUniquePointer.get()
之前评估 moveUniquePtr
。因为一个子表达式修改了另一个子表达式中使用的状态,所以整个表达式的结果没有明确定义。
将表达式拆分为顺序语句,如您的第二种情况,明确选择求值顺序,在这种情况下是正确的做法。