从函数返回左值

fil*_*imo 0 c++ lvalue

为什么从函数返回左值的结果是函数std::vector<int> v中的对象与函数中main()返回的对象具有相同的内存地址,即使这些对象存在于不同的堆栈帧中?std::vector<int> vecget_vec()

为什么没有调用移动构造函数?

#include <iostream>
#include <vector>


std::vector<int> get_vec()
{
    std::vector<int> vec = { 1, 2, 3, 4, 5 }; 
    std::cout << "get_vec():\n" << &vec << '\n' << vec.data() << "\n\n";   
    return vec;
}

int main()
{
    std::vector<int> v = get_vec();
    std::cout << "main():\n" << &v << '\n' << v.data() << "\n\n";   
  
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
get_vec():
0x7a07ee93baa0
0x226b290

main():
0x7a07ee93baa0
0x226b290
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 5

vec要么被移动(自动,因为你返回一个局部变量),要么,如果编译器足够聪明,是同一个对象v(这称为 NRVO)。

在这两种情况下都.data()将保持不变。移动时,新向量将获得另一个向量的堆内存的所有权。

&vec&v仅当编译器执行 NRVO 时才相同。