Почему же c # может вернуть объект, а c ++ не может при извлечении из контейнеров STL?

В 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». (по ссылке)

2

Решение

Дело в том, что в C ++ вы возвращаете копию элемента в коллекции, а в C # вы возвращаете ссылку. При возврате ссылки гарантированно не выдается исключение.

5

Другие решения

Потому что в C # операция «дешевая» — она ​​просто возвращает побайтную копию структуры или ссылки на объект.

В C ++ возвращение объекта является дорогостоящим — оно требует создания копия самого объекта путем вызова конструктора копирования, который может включать в себя практически что-нибудь пользователь указал, что должно произойти, включая (но не ограничиваясь) выделение новых ресурсов и уничтожение старых.

(Например, представьте, что возвращаемый объект — это двоичное дерево. очень дороже по сравнению с копированием, скажем, int.)

C ++ 11 мог использовал «семантику перемещения», чтобы избежать копирования объектов, но была введена семантика перемещения после pop_back был, и они не удосужились изменить его.

3

По вопросам рекламы [email protected]