【问题标题】:Is there any guarantee to be sure the left side of && operator is always evaluated first? [duplicate]是否有任何保证可以确保始终首先评估 && 运算符的左侧? [复制]
【发布时间】:2021-02-14 19:13:26
【问题描述】:

正如标题所说:C++ 标准是否有任何保证可以确保&&(或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


    【解决方案1】:

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

    【讨论】:

    • 需要注意的是,用户定义的operator&amp;&amp; 没有这种短路行为。并建议避免制作自己的用户定义operator&amp;&amp;
    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2021-12-21
    • 2014-11-29
    • 2011-08-06
    相关资源
    最近更新 更多