vector<int> vec3 = rtn_vec(); //way2
Это выделяет новый вектор и вызывает конструктор копирования, так что да, это «глубокая» копия.
На самом деле, это ничем не отличается от простого написания
vector<int> &vec2 = vec1;
vector<int> vec3 = vec1;
Или, чтобы сделать вещи еще яснее
vector<int> &return_value = vec1;
vector<int> &vec2 = return_value;
vector<int> vec3 = return_value;
(Хотя будьте осторожны с термином "глубокий". Если бы он был vector<int*>
, то были бы скопированы только указатели, а не сами int
.)