当循环返回"for each"项的 nullptr 时?
When "for each" loop returns nullptr for a item?
我观看了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>>
,其中shape
是circle
的基类(我怀疑这正是幻灯片作者想要的)。
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 如何从C++端挂接到 QML 项的 onClick 事件
- 数组初始值设定项的构造函数歧义
- C++17:如何在并行 STL 中获取工作项的索引
- 传递空初始值设定项列表时使用右值和左值引用候选项的重载解析
- C++ 替换字节数组中项的顺序
- 在 CPP 中打印具有重复项的选定长度字符的所有排列
- 列表视图项的替代颜色
- 清理"QSettings"注册表项的最佳方法(Windows上的Qt 5)
- 使用迭代器替换映射中的常量项的方法
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 访问类成员向量最后一项的正确方法
- 在 CMAKE 中使用具有静态依赖项的库
- 将指向多维数组向量中的单个项的指针传递给函数 c++
- 获取 c++ mfc vs2015 中弹出资源菜单项的 id
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 当循环返回"for each"项的 nullptr 时?
- 具有显式定义的默认构造函数的 unique_ptr 到 nullptr 错误的类内成员初始值设定项