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

标签 c++

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

#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/

相关文章:

java - PointerByReference 不返回值

c++ - 重载 << 运算符 C++ - 指向类的指针

c++ - boost 线程 pthread_mutex_lock 问题

c++ - c/c++ 使用 else 代替 if not

c++ - 如何从成员析构函数中捕获异常

c++ - 按长度(单词)对字符串数组进行排序 C++

c++ - 如何在 C++ 中使用字符串修饰符创建新字符串?

c++ - 当我取消引用指针并将值分配给某个变量时,内存会发生什么情况?

c++ - 如何在不调用 "-m"选项的情况下自动执行 git commit,以处理内部引号?

c++ - 对 `USER_ERROR__inconsistent_build_configuration__see_dlib_faq_1_' 的 undefined reference