c++ std::vector of structs which require a constructor [duplicate]

rekjcdws  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(113)

此问题已在此处有答案

Understanding Default Move Constructor Definition(3个答案)
昨天关门了。
仅在添加~MyClass()函数时出现问题。我认为错误是未定义的行为,或者与const MyClass&有关,也许这种引用不适用于emplace_back。评论解释其余部分:

#include <vector>
#include <iostream>
#include <memory>

struct MyClass
{
    const int x;

    MyClass(int _x) : x(_x)
    {
    }
};

struct MyClass2
{
    std::unique_ptr<MyClass> my;

    MyClass2(const MyClass& my2)
    {
        my.reset(new MyClass(my2.x));
    }
    
    // when adding this function
    // error: static assertion failed: result type must be constructible from input type
    ~MyClass2()
    {
        printf("deleting\n");
    }
};

int main()
{
    MyClass main(12);

    std::vector<MyClass2> ts;

    for (int i = 0; i < 10; ++i)
    {
        ts.emplace_back(main);
    }

    printf("%i\n", ts[0].my->x);

    return 0;
}
t8e9dugd

t8e9dugd1#

您需要取消引用std::unique_ptr以访问数据。

int main()
{
    std::vector<MyClass> ts;

    for (int i = 0; i < 10; ++i)
    {
        ts.emplace_back(123);
    }

    // error: use of deleted function 'std::unique_ptr'
    printf("%i\n", *ts[0].x);

    return 0;
}
wribegjk

wribegjk2#

调用emplace_back函数会尝试创建一个新的MyClass2对象并将该对象复制到vector中。但是,无法复制unique_ptr对象。因此,您需要像下面这样为MyClass2编写一个复制构造函数

MyClass2(const MyClass2& my2)
{
    my.reset();
}

相关问题