c ++, что делает "iter = ++ iter"? это действительно? - PullRequest
3 голосов
/ 01 сентября 2011

У меня вопрос по итераторам c ++ std.

предположим, что iter является std::set<SomeType>::iterator типом.

Является:

iter = ++iter 

так же, как:

++iter 

или они различны?


edit:

Я нашел код std::set<UserDefinedClass*>::iterator, используемый таким образом.(указатель)
Интересно, может ли это привести к сбою в работе программы.
Я читаю ответы, но сложно судить, какой ответ правильный.

Ответы [ 3 ]

7 голосов
/ 01 сентября 2011

На этот вопрос нет однозначного ответа. Ответ зависит от характера std::set<SomeType>::iterator типа. Если это определенный пользователем тип (то есть класс с перегруженными операторами), то поведение iter = ++iter определяется и действительно эквивалентно простому ++iter. Однако, если std::set<SomeType>::iterator является встроенным типом, то iter = ++iter создает неопределенное поведение, поскольку он изменяет один и тот же объект дважды в одном выражении без промежуточной точки последовательности (нарушение требований, представленных в 5/4 стандарта языка ).

Таким образом, теоретически в общем случае следует избегать подобных действий, поскольку в общем случае поведение не определено. На практике std::set<SomeType>::iterator обычно будет пользовательским типом, а iter = ++iter будет работать. Тем не менее, это не причина использовать такие выражения в коде.

2 голосов
/ 01 сентября 2011

Да, это одно и то же - но зачем это делать?

0 голосов
/ 01 сентября 2011

Да, тоже самое. Более простой случай, то же самое:

int i = 10;   //i = 10
int j = i++;  //j = 10
int k = ++i;  //k = 12

Тем не менее

i = ++i; 

не требуется, поскольку оно увеличивает i, а затем присваивает i i

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...