c++ - 如何在函数中创建局部变量?

标签 c++ variables constructor scope compilation

假设我有这段代码:

#include <iostream>
using namespace std;

class A{
public:
    A() { cout << "In normal ctor\n"; }
    A(const A& a) { cout << "In cpy ctor\n";  }
    A(A&& a) { cout << "In move ctor\n"; }
    ~A() { cout << "In dtor\n"; }
};

A func(A a) {
    return a;
}

void main(){
    A a1;
    A a2 = func(a1);
}

输出如下:

In normal ctor
In cpy ctor
In move ctor
In dtor
In dtor
In dtor

现在我无法理解函数“func”中发生的事情。

当 a1 被发送到函数时,函数不会通过 Ref 接收它,而是“创建”它自己的 a1 版本,即“a”。

这就是为什么当函数结束时,对象“死亡”并进入析构函数的原因。

那么为什么它不首先也交给构造函数呢? (假设真的在那里创建了一个本地对象)

幕后是否发生了任何复制?

提前致谢!

最佳答案

这是发生了什么(你的程序的打印输出和解释):

  • 在普通构造器中 - 这发生在 main
  • A a1;
  • 在 cpy ctor - 当 funcA aa1 初始化时会发生这种情况主
  • In move ctor - 这发生在 funcaa1 的拷贝,被设置为a2(参见 copy elision 作为返回)
  • 在 dtor - a1 的拷贝被销毁
  • 在 dtor - a2 被销毁
  • 在 dtor - a1 被销毁

我认为这里的关键是理解移动构造函数在创建 a2 中的作用。您的 func 按值返回 A,应该将其复制到 a2 中。但是,C++ 编译器意识到您的程序无法在赋值后使用原始值,因此它通过调用移动构造函数来优化调用。

关于c++ - 如何在函数中创建局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48755110/

相关文章:

c++ - 使用 SIMD : AVX2 version mixes up the order 将 8 位解包到 16 位

c++ - 递增 back_inserter 是可选的吗?

c++ - 监视 Windows 壁纸上的位置

c++ - 新的 C++ 是否向后兼容

javascript - Javascript 中的 constructor() 和 super() 方法

c++ - 初始化列表、可变参数模板和构造函数推导 : a strange case

php - 用什么替换 HTTP_GET_VARS?

variables - 使用后是否需要重置 pthread 条件变量?

html - 将变量应用于元素jquery

c++ - std::atomic 中的自定义类型