【发布时间】:2020-02-16 05:27:03
【问题描述】:
在这个 sn-p 中,我分配了一个本地对象 B,我将它传递给另一个对象 C 的构造函数,后者将其作为右值引用。然后我将后者放入容器中。
当我检索 C 并将其成员 static_cast 回 B 时,值不正确(valgrind 识别出 18 个错误!)
#include <iostream>
#include <memory>
#include <vector>
class A {
public:
virtual ~A() {};
};
class B: public A {
public:
B(int foo) : _foo(foo) {}
int _foo;
};
class C {
public:
C(A&& a): _a(std::move(a)) {}
A&& _a;
};
std::vector<C> v;
void bar() {
v.emplace_back(B(12));
}
int main() {
bar();
C&& c = std::move(v.front());
std::cout << static_cast<B&&>(c._a)._foo << std::endl;
return 0;
}
我的理解是,由于 C 采用右值引用,因此不应该有任何对象切片。我仍然应该能够检索到完整的 B 对象。此外,我对std::move 的理解(很可能是有缺陷的)是我可以将局部变量“移出”其上下文,并且通过获取右值引用,C 获得了 B 的所有权。
输出是39931504 而不是12。
谁能给我解释一下这是怎么回事?
【问题讨论】:
-
C有一个右值引用作为成员。所以它不拥有任何东西,它只是引用一个变量。该变量是函数bar中的局部变量,这意味着它会在函数结束后立即销毁。
标签: c++ move move-semantics rvalue-reference