人们会期望它们以完全相同的方式工作,但是。
class Range
{
public:
class DontMindMe
{
public:
DontMindMe(int a) : a_(a) {}
bool operator ==(const DontMindMe& ot) {return a_ == ot.a_;}
bool operator !=(const DontMindMe& ot) {return !(*this==ot);}
int operator *(void) {return a_;}
DontMindMe& operator++() {++a_; return *this;}
DontMindMe operator++(int) {auto temp{*this}; ++a_; return temp;}
private:
int a_;
};
Range(int a, int b, const std::string& msg)
: a_(a), b_(b) {std::cout << msg << std::endl;}
DontMindMe begin() {return a_;}
DontMindMe end() {return b_;}
private:
int a_;
int b_;
};
int main()
{
for(auto it = Range::DontMindMe(1); it != Range(1,10, "C++").end(); ++it);
std::cout << std::endl;
for(auto it : Range(1,10, "C++11"));
}
第一个循环打印消息10次,第二次打印只打印一次。他们不平等吗?这种差异会使旧代码修订变得复杂吗?
答案 0 :(得分:3)
第一个循环打印消息10次,第二次打印只打印一次。
这是正确的,因为在第一个循环中,您已经要求编译器创建一个新的Range
来比较每次进入循环时的迭代器。
他们不平等吗?
没有
这种差异会使旧代码修订变得复杂吗?
通常不会。只是你创造了一个人为的例子。