【问题标题】:Why does calling a function on seperate lines change the result in c++?为什么在单独的行上调用函数会改变 C++ 中的结果?
【发布时间】:2021-11-06 19:47:52
【问题描述】:

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

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

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

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

为什么会这样?

【问题讨论】:

  • 你试过用括号括起来 getSomePtr(someUniquePtr.get(), someArray) 吗?
  • 非常类似于this question。根据您的 C++ 版本,可能未指定指针是先移动还是先访问。
  • 涉及的类型有哪些?函数原型? moveUniquePtr(std::move(someUniquePtr) 的效果可能会因函数期望的参数类型而大不相同。
  • @Dúthomhas • 请参阅undefined behavior 部分,其中提到 C++17 标准在函数参数求值顺序方面发生了变化。
  • 好吧,在我非常疲倦的状态下,我只是在谈论函数的参数。你们都在谈论特殊情况,毫不奇怪,这里完全是主题……对此感到抱歉。是的,C++17 阐明了 -> 的所有 LHS 都在 RHS 之前排序。

标签: c++ smart-pointers


【解决方案1】:

在计算表达式时,函数参数在调用接受这些参数的函数之前被计算。

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

将表达式拆分为顺序语句,就像在第二种情况下一样,明确选择评估顺序,在这种情况下是正确的做法。

【讨论】:

  • 将表达式拆分为顺序语句也使其更易于阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2013-07-22
  • 2018-03-25
  • 1970-01-01
相关资源
最近更新 更多