Что представляет собой адрес вектора?
Память компьютера может быть из массива байтов. Адрес памяти является указателем на этот образный массив. Это то же самое для всех объектов, включая векторы.
Если я верну вектор из функции, объект, которому он назначен, будет иметь такой же адрес (без возврата в качестве ссылки), кактот, который объявлен в функции.
Стандарт не гарантирует этого. Но это действительно возможно. Это происходит всякий раз, когда оптимизация именованных возвращаемых значений используется для исключения копирования / перемещения возвращаемого значения.
Тогда я предположил, что это происходит из-за того, что оператор ... & может быть перегружен втаким образом, что ...
Адрес оператора вектора не перегружен.
Можете ли вы объяснить, что происходит?
Вы вернетеськопия члена, а не локальная автоматическая переменная. NRVO не может использоваться в этом случае.
Независимо от подобъектов, более одного объекта не могут перекрывать одну и ту же память в любой момент времени. Если два объекта существуют одновременно, то каждый из них должен иметь отдельный адрес. С другой стороны, когда память одного объекта освобождается, она может быть повторно использована другим объектом.
В первом примере время жизни локальной переменной заканчивается, поэтому для ее памяти нет проблем сперекрываются с памятью переменной, которая инициализируется из возвращаемого значения.
Во втором примере время жизни a
и, следовательно, его член перекрываются со временем жизни bar
, и поэтому они не могутПерекрытие в памяти.