0
人們會期望他們的工作方式完全相同,但是。C++ 11範圍 - 在功能上不等於經典?
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次,第二次只打印一次。他們不平等嗎?這種差異是否會使舊代碼修訂複雜化?
在每次循環迭代中重新計算範圍末尾的做法都被忽視了 - 並且正確如此。 – SergeyA