我在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”获得时,它是如何为空的?
答案 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>>
,其中shape
是circle
的基类(我怀疑这正是幻灯片作者的想法)。