【发布时间】:2015-08-20 13:35:10
【问题描述】:
以下代码运行良好,但据我了解,它不应该
#include <iostream>
#include <vector>
struct Data
{
explicit Data():value(1){}
int value;
};
struct Foo
{
explicit Foo(Data& data):data_(data){}
inline void print() const
{
std::cout<<data_.value<<std::endl;
}
Data& data_;
};
void addEntry(std::vector<Foo>& vec)
{
Data data;
Foo foo(data);
vec.push_back(foo);
}
int main()
{
std::vector<Foo> vec;
addEntry(vec);
vec[0].print();
}
函数addEnty 创建一个名为data 的Data 实例。然后创建Foo 的实例,称为foo,其中存储了对data 的引用。然后将这个距离复制到向量vec 中。因此,当函数结束时,vec[0] 应该包含一个悬空引用,因为 data 已被销毁。我对吗?所以我希望得到一些垃圾调用方法print()。我获得正确的值 1 是偶然还是我错过了什么?
为了使其正确,我会移动数据以避免悬空引用。所以我会修改构造函数
explicit Foo(Data&& data):data_(data){}
和函数
Foo foo(std::move(data));
这样foo,因此它在vec[0] 中的副本包含实例data,而不是对它的引用。我对吗?这是正确的解决方案吗?这样Foo::data_需要是Data类型还是Data&类型?
【问题讨论】:
标签: c++ c++11 move lvalue rvalue