gpt4 book ai didi

c++ - 左值与右值可疑

转载 作者:行者123 更新时间:2023-11-30 01:13:26 25 4
gpt4 key购买 nike

下面的代码运行良好,但据我所知,它不应该

#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 函数创建了一个名为dataData 实例。然后创建一个 Foo 的实例,称为 foo,它存储对 data 的引用。然后将该距离复制到 vector vec 中。因此,当函数结束时,vec[0] 应该包含一个悬挂引用,因为 data 已被销毁。我对吗?所以我希望通过调用方法 print() 获得一些垃圾。是我偶然获得了正确的值 1 还是我遗漏了什么?

为了使其正确,我会 move 数据以避免悬空引用。所以我会修改构造函数

explicit Foo(Data&& data):data_(data){}

和函数

Foo foo(std::move(data));

通过这种方式,foo 及其在 vec[0] 中的拷贝包含实例 data 而不是对其的引用。我对吗?这是正确的解决方案吗?这样,Foo::data_需要是Data类型还是Data&类型?

最佳答案

Yes Foo 将持有悬空引用。 Foo 类应该保存 Data 而不是 Data& 或 Data&&。

#include <iostream>
#include <vector>

struct Data
{
explicit Data():value(1){}
int value;
};

struct Foo
{
// this is needed if you want to pass lvalue
Foo(const Data& data):data_(data)
{}
// for rvalue
Foo(Data&& data):data_(std::move(data))
{}

void print() const
{
std::cout<<data_.value<<std::endl;
}

Data data_;
};

void addEntry(std::vector<Foo>& vec)
{
vec.emplace_back(Foo(Data()));

// or

Data data;
// do somth with data
vec.emplace_back(Foo(std::move(data)));

// or

Data data;
// do somth with data
Foo foo {std::move(data)};
// do somth with foo, but
// do not use data here!!!
vec.push_back(std::move(foo));
}

int main()
{
std::vector<Foo> vec;
addEntry(vec);
vec[0].print();
}

关于c++ - 左值与右值可疑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32119757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com