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

Mat*_*toy 1 c++ smart-pointers

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

getSomePtr(someUniquePtr.get(), someArray)->moveUniquePtr(std::move(someUniquePtr));
Run Code Online (Sandbox Code Playgroud)

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

auto* somePtr = getSomePtr(someUniquePtr.get(), someArray);
somePtr->moveUniquePtr(std::move(someUniquePtr));
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种情况?

com*_*orm 5

计算表达式时,会在调用采用这些参数的函数之前对函数参数进行计算。

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

将表达式拆分为顺序语句(如第二种情况),显式选择计算顺序,并且在这种情况下是正确的做法。