По поводу указателя ситуация обстоит следующим образом:
C++ |
1
| vector<T> *addition_result_vector = 0; |
|
Создается временный объект типа указатель на vector<T>. Время жизни этого объекта ограничено
C++ |
1
2
3
| { // scope - областью видимости объекта.
} |
|
, он в данный момент указывает на адрес 0.
Этот объект занимает в памяти для 32-битной версии программы 8 байт и может хранить в себе адрес ячейки памяти, чтото вроде 0x8f7d008 - например.
Далее в конце функции вызывается
C++ |
1
| return addition_result_vector; |
|
При том что в объявлении шаблонной функции было указано, что функция возвращает указатель на объект типа vector по значению:
C++ |
1
2
| template<class T> vector<T> * addition_of_vectors(vector<T>& first_vector,
vector<T>& second_vector) |
|
Таким образом при вызове return - адрес 0x8f7d008 скопируется rvalue переменную, время жизни которой ограничено непосредственным местом вызова функции:
C++ |
1
2
| std::vector<int> *pointer_to_addition_result_vector = /* Вот тут она проживет ровно до точки с запятой*/ addition_of_vectors(
first_integer_vector, second_integer_vector); |
|
Но поскольку мы вызываем оператор присваивания = - то значение адреса будет уже скопировано в
переменную std::vector<int> *pointer_to_addition_result_vector - которая была объявлена в функции main и время жизни которой ограничено областью видимости внутри main функции. Таким образом - валидная память - за счет того, что объект был выделен в куче оператором new была передана в валидный указатель - с которым далее и идёт работа.