2016-04-15 49 views
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次,第二次只打印一次。他們不平等嗎?這種差異是否會使舊代碼修訂複雜化?

回答

3

第一次循環打印信息10次,第二次只打印一次。

這是正確的,因爲在第一個循環中,您已要求編譯器創建一個新的Range來比較每次迭代器到每次輸入循環時。

他們不一樣嗎?

沒有

這種差異可以複雜舊代碼進行修改?

通常不會。這只是你創造了一個人爲的例子。

+1

在每次循環迭代中重新計算範圍末尾的做法都被忽視了 - 並且正確如此。 – SergeyA