set2.begin() 返回的迭代器类型

3
在一个测验题中,我认为以下代码不会编译,因为我期望迭代器类型为set<int>::iterator而不是set<int, int>::iterator
我可以在C++98、C++11和C++14中成功编译以下程序,并且它打印出结果9 5 4 3 2 1 0 0, 1, 2, 3, 4, 5, 9,。这个程序似乎是正确的。
为什么在那一行中,迭代器类型set<int, int>::iterator是可接受的呢?
#include <iostream>
#include <set>
#include <vector>
#include <functional>
using namespace std;

int main(){
        int mynumbers[] =        { 3, 9, 0, 2, 1, 4, 5 };
        vector<int>        v(mynumbers, mynumbers+7);
        set<int> set1(v.begin(),v.end());
        set<int, greater<int> > set2(v.begin(), v.end());

        // 
        // The following iterator type compiles. Why is that so ?
        // 
        for(set<int, int>::iterator i=set2.begin();i!= set2.end(); i++)
                cout<<*i<<" ";

        for(set<int>::iterator i=set1.begin();i!= set1.end(); i++)
                cout<<*i<<", ";
        cout<<endl;
        return 0;
}
1个回答

4
为什么在那一行中迭代器类型set<int, int>::iterator可接受?
不可以。 int不是比较器。您正在违反标准的要求。该程序是不合法的。 某些编译器更严格地检查这些要求。
参考:正确的类型应该是set<int, greater<int> >::iterator,或者对于C++11及以后版本只需使用autoset<int>::iterator也是错误的。

谢谢。在此期间,我已经说服了自己。我不确定是因为在某些编译器上它似乎可以编译并给出结果,例如http://cpp.sh/26stz。 - Ely
@Ely:当涉及到C++时,“似乎可以工作”总是一个薄弱的论据。许多不正确的代码偶尔也能够“工作”。 - Baum mit Augen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接