C++中右值与右值引用在使用中的疑问

Symbo1ic · 2024-11-12 23:02:11 · 110 次点击

如标题。最近在看现代 cpp ,感觉右值和右值引用这两个概念非常重要,因此自己尝试构建一些例子来加深理解。例子如下:

#include <iostream>
#include <ostream>
#include <utility>
using namespace std;
struct C {
    int a = 1;
    C() { cout << "Ha ha" << endl; }
    C(C& c) : a(c.a) { cout << "Copy" << endl; }
    C(C&& c) : a(std::move(c.a)) { cout << "Move" << endl; }
    ~C() { cout << "Fucked" << endl; }
};
C func() {
    C shit;
    cout << &shit << endl;
    return shit;
}

C f2() {
    C&& shit = func();
    cout << &shit << endl;
    return shit;
}

C f3() {
    C&& shit = func();
    cout << &shit << endl;
    return std::move(shit);
}

int main() {
    auto&& shit = f2();
    // Ha ha
    // 0x5ffe24
    // 0x5ffe24
    // Copy
    // Fucked
    cout << &shit << endl;
    // 0x5ffe7c
    cout << "*************" << endl;
    auto shit2 = f3();
    cout << &shit2 << endl;
    // Ha ha
    // 0x5ffe24
    // 0x5ffe24
    // Move
    // Fucked
    // 0x5ffe78
    cout << "*************" << endl;
    auto&& shit3 = f3();
    cout << &shit3 << endl;
    // Ha ha
    // 0x5ffe24
    // 0x5ffe24
    // Move
    // Fucked
    // 0x5ffe74
    cout << "*************" << endl;
    // cout << shit.a;
}

对于这个例子所产生的结果,我不是很懂,我主要是不太懂以下几个问题:

  1. 为啥对于右值引用 shit ,在初始化之前会产生 copy ?而对于 shit2 则会在之前有 move ?
  2. 我尝试将 f3 的声明改成了'C&& f3()',这个时候 clangd 警告引用了一个栈空间上的变量。为啥会这样?正常来说右值引用应该怎么使用?
  3. f2 和 f3 都引用了位于 func 构建出来的函数栈上的 shit ,从地址可以看出他们引用后地址没有产生变化。则使用右值引用引用了一个位于栈上的值,从 cpp 内存模型的角度来讲是怎么做到的?这种做法会不会对在该值所在的函数之后运行的函数栈空间分配产生影响?
举报· 110 次点击
登录 注册 站外分享
快来抢沙发
0 条回复  
返回顶部