Допустим, у нас есть итератор (iter) над списком указателей на память, назначенный пространству кучи, если я это сделаю
delete (*iter++)
я прав, что приоритет — сначала итератор разыменования, чтобы получить адрес памяти, затем освободить место и затем увеличить итератор, чтобы освободить следующий элемент?
Эффект такой, какой вы пишете, но он достигается с помощью несколько иной последовательности:
Постинкремент имеет наивысший приоритет, поэтому он оценивается первым. Однако его возвращаемое значение (которое обрабатывается другими операторами) является значением iter
до приращение.
Разыменование вычисляется следующим, возвращая указатель, к которому не приращенное значение iter
был «указывая».
delete
оценивается последним, а указатель удаляется.
Хотя ++
имеет более высокий приоритет, чем *
, побочные эффекты постинкремента ++
применяются после оператор разыменования *
использовал значение итератора. Это поведение постинкремента или суффикса ++
, (в отличие от преинкремента или префикса ++
). Это правило применяется как к итераторам, так и к «простым» указателям.
старшинство на самом деле наоборот, и если итератор имеет тип класса (с перегруженными операторами), то это порядок вызовов операторных функций:
iter
звонил.Строка эквивалентна этому:
delete (*(iter++))
Но поскольку постфиксный инкремент возвращает исходное значение, вы по-прежнему разыменовываете исходное значение iter
, Следовательно, если iter
указывает на указатель на динамически размещенный объект, delete
уничтожит этот объект. затем iter
будет слева, указывая на следующий указатель вдоль.