[英]Why do C++ std container iterators ignore some template parameters of their underlying container?
這是一個具體的例子。 在下面的代碼中,我預計會出現編譯錯誤,例如“無法將 std::map< int, int, cmp >::iterator 類型的值賦給 std::map< int, int >::iterator 類型的變量” . 但是,我能夠毫無問題地編譯代碼(g++ C++20 Wall)。 感謝幫助。
#include <map>
struct cmp {
bool operator()(const int a, const int b) const { return a > b; }
};
int main(int argc, char *argv[]) {
std::map<int, int> m1;
std::map<int, int>::iterator m1_it = m1.begin();
std::map<int, int, cmp> m2;
std::map<int, int, cmp>::iterator m2_it = m2.begin();
// Why do these work?
m1_it = m2.begin();
m2_it = m1.begin();
return 0;
}
標准對迭代器類型幾乎沒有限制,只是強加了一些行為。
尤其是:
他們不必在namespace std
中。 所以T*
可能是std::vector<T>
的有效迭代器。
它們不必具有與其容器相同的模板參數。 對於上面的示例, T*
可能是任何Allocator
的std::vector<T, Allocator>
的迭代器。
事實上,它的類型安全性較低,模板參數越少,實例化就越少(編譯速度越快,生成的類似代碼越少……)。
請注意,您的代碼可能無法針對將所有模板參數用於其迭代器的編譯器/庫進行編譯。
一個實際的原因是這可能會導致更小的可執行文件。 你的兩個 map 類型可以共享一個迭代器類型,所以所有的迭代器函數也是共享的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.