问题描述
伙计们,我是 C++ 的新手。所以请原谅我在这里的无知。我试图理解我在网上获得的以下代码。 while (next != end) 行到底做了什么?当我打印 &next 和 &end 的地址时,它们总是不同的(甚至发布 while 循环)。我认为 examples/lc.rkt
和 std::sregex_iterator next
是两个不同的实例。那么为什么 std::sregex_iterator end
行认为它们会在某个时间点相等?我在引擎盖下看了看。好像是while (next != end)
。
我试图了解构造函数等,但不想列出我发现的所有那些,因为它们可能不相关。只是为了让您知道我来自 Java 世界,但一直在学习了解 C++ 的课程。
非常感谢任何帮助。谢谢
regex_iterator<string::const_iterator>
解决方法
只是想让你知道我来自 Java 世界,但一直在学习了解 C++ 的课程
这似乎是您困惑的原因。与 Java 相比,C++ 使用值语义。这意味着,当您通过 ==
比较两个对象时,它不会测试身份,而是测试相等性,即比较值。
考虑一下
int x = 42;
int y = 42;
这是两个不同的对象,但它们的值是相同的:
assert( x == y );
assert( &x != &y );
Java 有这种装箱和简单类型的怪癖(不确定它们实际上是如何调用的),但在 C++ 中,可以重载 ==
的自定义类型也应该使用值语义。例如
std::string x{"Foo"};
std::string y{"Foo"};
assert( x == y );
assert( &x != &y );
输入迭代器通常不知道输入在哪里结束。例如,std::istream_iterator
也是如此。在这种情况下启用 next != end
的一种可能方法是 operator++
设置一些内部状态,表示已到达输入结束。然后next != end
,只检查该标志是否设置在next
(当然也需要end
,即默认构造的迭代器是“特殊的”,尽管那是实现细节,基本上你只需要知道它有效;)