首页 > 解决方案 > 是否有任何保证可以确保始终首先评估 && 运算符的左侧?

问题描述

&&正如标题所说:C++ 标准是否有任何保证可以确保(or ) 运算符的左侧and总是首先被评估?老实说,我无法在C++17 Standard中搜索,我不知道我最寻找哪个部分。

问题样本:

我想做这样的事情:

std::unordered_map<std::size_t, std::weak_ptr<T>> objects;

bool f (std::size_t const id) {
  bool result = false;

  if (not objects.at(id).expired()) {
    auto const& object = objects.at(id).lock();

    /* Here left side of `and` most be evaluated first */
    result = object->parent->remove(id) and 
             objects.erase(id) == 1;
  }

  return result;
}

并希望确保代码没有问题。

标签: c++language-lawyer

解决方案


[expr.log.and]/1 ... 与 不同&&&保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。


推荐阅读