c++移动构造函数和作用域
C++ move constructor and scope
如果我有一个在堆栈上声明的对象,并且我返回对它的引用,我相信我将无法再访问它,因为它超出了作用域。正确吗?
如果我只是返回对象本身(不是对它的引用)怎么办?会调用复制构造函数吗?(我听说过术语"移动构造函数",但从我读到的,它似乎是一个新功能。有人能详细说明一下吗?)
在哪些情况下会调用析构函数?
如果我有一个在堆栈上声明的对象,并且我返回对它的引用,我相信我将无法再访问它,因为它超出了作用域。正确吗?
正确,析构函数将在超出作用域时被调用。
如果我只是返回对象本身(不是对它的引用)怎么办?会调用复制构造函数吗?
可以调用复制构造函数和析构函数,但通常编译器将执行返回值优化,而不会进行复制、析构函数或移动操作。
要了解move构造函数,请阅读move语义和右值引用。
如果我有一个在堆栈上声明的对象,并且我返回对它的引用,我相信我将无法再访问它,因为它超出了作用域。正确吗?
正确,许多编译器也会给你警告。
如果我只是返回对象本身(不是对它的引用)怎么办?会调用复制构造函数吗?
它将调用复制构造函数。来自标准的Std::数组没有Std::move构造函数定义为内部使用堆栈内存。因此将调用复制构造函数。
在哪些情况下会调用析构函数?
在这两种情况下都将调用析构函数。只是在move构造函数之后,我们将所有指针/处理到其他对象,因此对象状态将是空的(但一致)。
编译器将尝试优化这些函数以消除复制操作。结果代码将表现得好像对象是在函数返回具有适当生命周期的对象时创建的。参考这里。这取决于编译器,以及代码本身在构造点和使用点的结构。优化也可能是不可能的,在这种情况下,您可能需要调用复制或移动构造函数(如果可用)。
如果编译器优化了函数,那么当使用点的对象超出最近的块作用域时,将调用析构函数。
如果没有优化,则对象将在使用点被复制到另一个对象(一次调用复制/移动构造函数),然后函数中的对象将被销毁(如果复制),最后当复制/移动对象的析构函数在函数返回它的位置(使用点)离开最近的块作用域时将被调用。
但是,如果从函数返回一个临时变量,那么你将返回一个指向已销毁内存的引用或指针,因为你的临时变量将在函数返回时超出作用域而被销毁。
- C++quit()函数中可能存在作用域问题
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 是同一作用域的函数部分中的函数调用
- 在构造函数中输入对象时C++类成员作用域
- 在调用函数的作用域中构造返回的对象
- c++中的继承、作用域和模板构造函数
- 键入安全枚举和作用域辅助函数
- 被视为依赖作用域的函数模板的函数作用域结构体的静态成员函数
- 局部作用域和函数作用域的区别
- 在c++中,没有变量名的构造函数调用的生存期/作用域是什么?
- 从构造函数捕获异常意味着我的实例之后超出了作用域
- 在包含作用域的函数调用期间持续的临时函数参数
- 构造函数排序(全局作用域)问题
- 名称空间作用域构造函数定义是否需要类限定的标识符
- 为结构的数组创建指针作用域和构造函数
- 为什么基类构造函数没有被作用域解析操作符调用
- c++移动构造函数和作用域