当循环返回"for each"项的 nullptr 时?

When "for each" loop returns nullptr for a item?

本文关键字:nullptr 项的 for 循环 返回 each      更新时间:2023-10-16

我观看了Herb Sutter的CppCon"Writeing Good C++14…By Default",其中一张幻灯片上有以下代码:

auto p = make_shared<circle>(42);
auto v = load_shapes();
for(auto& s: v) {
  if(s && *s == *p) {
    cout << *s << "is a matchn";
  }
}

我的问题是:为什么有

如果(s&&s==*p)

检查?

为每个循环初始化的引用变量如何成为nullptr?循环在项上迭代,那么在哪种情况下可以分配nullptr值?

编辑:我感兴趣的是这张支票的用途:

if(s)

当s由"for each"获得时,它怎么可能为null?

假设以下定义。

struct circle {
    circle(int r) :radius(r) {}
    int radius;
    bool operator==(circle rhs) const {
        return radius == rhs.radius;
    }
};
std::vector<circle*> load_shapes() {
    std::vector<circle*> vec;
    for (int i = 0; i < 10; ++i)
        vec.push_back(nullptr);
    return vec;
}

有了这个,我现在可以将示例代码插入到一个主函数中:

int main() {
    using namespace std;
    auto p = make_shared<circle>(42);
    auto v = load_shapes();
    for(auto& s: v) {
      if(s && *s == *p) {
        cout << *s << "is a matchn";
      }
    }
}

根据load_shapes的定义,v(主要)属于std::vector<circle*>类型,它有10个元素,所有元素都是空指针。因此,在for循环中,s的类型为circle*&(引用指向圆的指针)。在每次迭代中,它所引用的指针都是一个空指针。这就是if语句要检查的内容。

请注意,当然还有其他可能的定义。例如,load_shapes可以返回std::vector<std::shared_ptr<shape>>,其中shapecircle的基类(我怀疑这正是幻灯片作者想要的)。