Я видел код, использующий вектор,
vector<int>s;
s.push_back(11);
s.push_back(22);
s.push_back(33);
s.push_back(55);
for (vector<int>::iterator it = s.begin(); it!=s.end(); it++) {
cout << *it << endl;
}
Он такой же, как
for (auto it = s.begin(); it != s.end(); it++) {
cout << *it << endl;
}
Насколько безопасно в этом случае использование ключевого слова auto? А что если тип вектора float
? string
?
Ключевое слово auto просто просит компилятор определить тип переменной на основе инициализации.
Даже компилятор до C ++ 0x знает тип выражения (инициализации), и чаще всего вы можете увидеть этот тип в сообщениях об ошибках.
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int>s;
s.push_back(11);
s.push_back(22);
s.push_back(33);
s.push_back(55);
for (int it=s.begin();it!=s.end();it++){
cout<<*it<<endl;
}
}
Line 12: error: cannot convert '__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, __gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > >' to 'int' in initialization
Ключевое слово auto просто позволяет вам воспользоваться этим знанием - если вы (компилятор) знаете правильный тип, просто выберите его за меня!
Ключевое слово auto получает тип из выражения справа от =. Следовательно, он будет работать с любым типом, единственное требование - инициализировать автоматическую переменную при ее объявлении, чтобы компилятор мог определить тип.
Примеры:
auto a = 0.0f; // a is float
auto b = std::vector<int>(); // b is std::vector<int>()
MyType foo() { return MyType(); }
auto c = foo(); // c is MyType
auto
предназначено для использования в такой ситуации, оно абсолютно безопасно. Но, к сожалению, оно доступно только в C++0x, поэтому у вас возникнут проблемы с его переносимостью.