В C # при извлечении из стека он удаляет объект из стека и возвращает объект.
Однако в C ++ из-за http://blogs.msdn.com/b/zhanli/archive/2010/06/29/c-tips-why-the-pop-method-of-stl-stack-does-not-return-a-value. ASPX, функция pop не возвращает объект.
Что делает C # способным делать то, чего не может C ++?
Или это больше похоже на то, как C # не волнует, случится ли это исключение или нет? «Если оператор = или конструктор копирования выдает исключение, у нас будут проблемы: внутреннее состояние стека изменилось, но мы не получили элемент popped». (по ссылке)
Дело в том, что в C ++ вы возвращаете копию элемента в коллекции, а в C # вы возвращаете ссылку. При возврате ссылки гарантированно не выдается исключение.
Потому что в C # операция «дешевая» — она просто возвращает побайтную копию структуры или ссылки на объект.
В C ++ возвращение объекта является дорогостоящим — оно требует создания копия самого объекта путем вызова конструктора копирования, который может включать в себя практически что-нибудь пользователь указал, что должно произойти, включая (но не ограничиваясь) выделение новых ресурсов и уничтожение старых.
(Например, представьте, что возвращаемый объект — это двоичное дерево. очень дороже по сравнению с копированием, скажем, int
.)
C ++ 11 мог использовал «семантику перемещения», чтобы избежать копирования объектов, но была введена семантика перемещения после pop_back
был, и они не удосужились изменить его.