gpt4 book ai didi

c++ - 具有引用成员的类的默认移动构造函数

转载 作者:太空狗 更新时间:2023-10-29 20:33:10 25 4
gpt4 key购买 nike

这是一个最小的例子,是从一个更大的项目中提取出来的。

#include <vector>
#include <cassert>
using namespace std;


class Data
{
int value_;
public:
int const& value = value_;

Data(int init)
{
value_ = init;
assert(value == value_);
}

//Data(Data const& other)
//{
// value_ = other.value_;
//}
// Data(Data && other) = default;

~Data()
{
assert(value == value_);
}
};

int main()
{
std::vector<Data> datas;
for (int i = 0; i < 10; ++i)
{
datas.push_back(Data(i));
}
}

析构函数中的断言有时会失败;在这一点上我不知道。我傻眼了。提供复制 c-tor 工作,但随后启用默认 move-ctor 再次失败。

默认移动/复制 c-tor 如何处理此类引用?我无法用调试器分析幕后发生的事情。
在 C++ 中使用 public const& 是提供 getter 的有效方法吗?

最佳答案

How does default move/copy c-tor handles such references?

拷贝的成员将引用源成员引用的同一对象。

在这种情况下,引用的对象是另一个成员。因此,如果您从 A 复制 B,那么 B 的引用成员将引用 A 的对象成员>,因为那是 A 的引用成员所引用的内容。如果 A 被销毁,则 B 的引用成员将悬而未决,并且通过它访问对象(不再存在)具有未定义的行为。

确实,您可以使用自定义复制/移动构造函数来初始化引用以引用其他对象,但引用成员通常毫无用处。

Is using public const& a valid way in C++ to provide a getter?

这不是一个好的解决方案。

关于c++ - 具有引用成员的类的默认移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56657891/

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