当“for each”循环返回一个项目的nullptr时?

时间:2016-05-05 21:52:49

标签: c++ c++11

我在Herb Sutter看过CppCon“写好C ++ 14 ...默认情况”,其中一张幻灯片是跟着一段代码:

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

我的问题是:为什么会有

  

if(s&amp;&amp; * s == * p)

检查?

为每个循环初始化的引用变量如何 nullptr ?循环遍历项目,所以在这种情况下可以分配 nullptr 值吗?

修改: 我的兴趣点是这个检查:

if(s)

当s为“for each”获得时,它是如何为空的?

1 个答案:

答案 0 :(得分:3)

假设以下定义。

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 match\n";
      }
    }
}

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

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