auto из C++0X: const or not const
От: ilvi Россия  
Дата: 06.04.10 04:28
Оценка:
День добрый.
Просматривал сейчас очередную статейку на тему, что нового нам чудный мир несет
И появился в голове вопрос по поводу использования auto.
Одним из самых приятных для меня моментов в использовании auto, это возможность не писать тип итератора.

container::iterator it = cont.begin(); // 1
auto it = cont.begin(); //2


И вот тут интересно. У нас auto всегда будет трактоваться как в первой строчке или счастье все-таки может быть полным и есть возможность в случае необходимости заставить компилятор трактовать вторую строку следующим образом:

container::const_iterator it = cont.begin(); // 3



?
Re: auto из C++0X: const or not const
От: jazzer Россия Skype: enerjazzer
Дата: 06.04.10 04:31
Оценка: 53 (7) +1
Здравствуйте, ilvi, Вы писали:

I>День добрый.

I>Просматривал сейчас очередную статейку на тему, что нового нам чудный мир несет
I>И появился в голове вопрос по поводу использования auto.
I>Одним из самых приятных для меня моментов в использовании auto, это возможность не писать тип итератора.

I>
I>container::iterator it = cont.begin(); // 1
I>auto it = cont.begin(); //2
I>


I>И вот тут интересно. У нас auto всегда будет трактоваться как в первой строчке или счастье все-таки может быть полным и есть возможность в случае необходимости заставить компилятор трактовать вторую строку следующим образом:


I>
I>container::const_iterator it = cont.begin(); // 3
I>


в стандартных контейнерах добавятся методы cbegin и cend, которые будут возвращать container::const_iterator, так что:
auto it = cont.cbegin(); // 4
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: auto из C++0X: const or not const
От: Bell Россия  
Дата: 06.04.10 04:45
Оценка:
Здравствуйте, ilvi, Вы писали:

Ну заставить-то в любом случае можно
auto it = const_cast<const container_t&>(cont).begin()


А вот чтоб само — тут так, а там вот так — очень вряд ли
Любите книгу — источник знаний (с) М.Горький
Re: auto из C++0X: const or not const
От: Юрий Жмеренецкий ICQ 380412032
Дата: 06.04.10 04:48
Оценка: 11 (1)
Здравствуйте, ilvi, Вы писали:

I>День добрый.

I>Просматривал сейчас очередную статейку на тему, что нового нам чудный мир несет
I>И появился в голове вопрос по поводу использования auto.
I>Одним из самых приятных для меня моментов в использовании auto, это возможность не писать тип итератора.

I>
I>container::iterator it = cont.begin(); // 1
I>auto it = cont.begin(); //2
I>


I>И вот тут интересно. У нас auto всегда будет трактоваться как в первой строчке или счастье все-таки может быть полным и есть возможность в случае необходимости заставить компилятор трактовать вторую строку следующим образом:


I>
I>container::const_iterator it = cont.begin(); // 3
I>


I>?


Тип итератора зависит от типа 'cont':

std::string a("qwerty");
const std::string b(a);

auto i1 = a.begin(); // std::string::iterator
auto i2 = b.begin(); // std::string::const_iterator


т.к. функция 'begin' имеет две версии, константную и "обычную".
Re[2]: auto из C++0X: const or not const
От: ilvi Россия  
Дата: 06.04.10 04:54
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Тип итератора зависит от типа 'cont':


ЮЖ>
ЮЖ>std::string a("qwerty");
ЮЖ>const std::string b(a);

ЮЖ>auto i1 = a.begin(); // std::string::iterator
ЮЖ>auto i2 = b.begin(); // std::string::const_iterator
ЮЖ>


ЮЖ>т.к. функция 'begin' имеет две версии, константную и "обычную".


Это понятно. Но как-то заводить копию контейнера для этого
Нововведение, о котором упомянул Jazzer http://rsdn.ru/forum/cpp/3763212.1.aspx
Автор: jazzer
Дата: 06.04.10
, подходит гораздо лучше в этом случае.
Re[3]: auto из C++0X: const or not const
От: Bell Россия  
Дата: 06.04.10 05:00
Оценка:
Здравствуйте, ilvi, Вы писали:

...
I>Это понятно. Но как-то заводить копию контейнера для этого
Зачем копию?! Достаточно каста в константную ссылку.
I>Нововведение, о котором упомянул Jazzer http://rsdn.ru/forum/cpp/3763212.1.aspx
Автор: jazzer
Дата: 06.04.10
, подходит гораздо лучше в этом случае.

С этим трудно поспорить
Любите книгу — источник знаний (с) М.Горький
Re[3]: auto из C++0X: const or not const
От: Юрий Жмеренецкий ICQ 380412032
Дата: 06.04.10 05:03
Оценка:
Здравствуйте, ilvi, Вы писали:
...
ЮЖ>>т.к. функция 'begin' имеет две версии, константную и "обычную".

I>Это понятно. Но как-то заводить копию контейнера для этого


Копию необязательно, достаточно ссылки.
Re[2]: auto из C++0X: const or not const
От: Erop Россия  
Дата: 06.04.10 05:09
Оценка: 1 (1) +1
Здравствуйте, Bell, Вы писали:

B>
B>auto it = const_cast<const container_t&>(cont).begin()
B>


B>А вот чтоб само — тут так, а там вот так — очень вряд ли


Вообще-то нетрудно автоматизировать...
template<typename T> T const& toConstRef( T& t ) { return t; }
template<typename T> T const& toConstRef( T const& t ) { return t; }


auto it = toConstRef( cont ).begin();
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.