【发布时间】:2020-05-14 07:17:43
【问题描述】:
#include <stdio.h>
#include <memory>
struct A {
A() { printf("A()\n"); }
virtual ~A() { printf("~A()\n"); }
};
struct B : public A {
B() { printf("B()\n"); }
virtual ~B() { printf("~B()\n"); }
};
A&& foo() {
B b;
return std::move(b);
}
int main() {
A&& a = foo();
// const A& a = foo(); // same output
printf("checkpoint\n");
}
output:
A()
B()
~B()
~A()
checkpoint
检查点是最后一行,为什么?我想让 foo 返回引用而不是指针来实现多态,有没有办法做到这一点?
PS:这个问题可能相关:Why a & b have the same address?
更重要的是,我只是一个返回函数内创建的对象的方案,但不使用指针。出于一个原因,指针需要删除,出于另一个原因,认为 A & B 是支持基于范围的 for 循环的迭代器,其取消引用 operator* 被重新定义,使用指针或 unique_ptr/shared_ptr 不是一个好主意,我猜。
【问题讨论】:
-
可以返回左值/右值引用,但不能返回悬空引用。
-
函数局部变量在函数返回时被销毁,因此它的右值引用变得无效。指针和左值引用也是如此,因此从这个意义上说,右值引用并没有什么特别之处。
-
那么如何返回一个在移动语义中创建的非悬空的?没有指针,没有重新定义 operator* 的 unique_ptr 或 shared_ptr,因为我正在制作 A & B 某种迭代器,它们也定义了自己的 operator*。
-
随便
B foo() {B b; return b;}? -
foo 必须返回 A,调用者不知道 B。问题是“如何返回基类型引用而不是基类型指针,但开销为零(无复制)”跨度>
标签: c++