gpt4 book ai didi

c++ - 如何在 C++11 中将 vector 与引用类型实例对象一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:50 24 4
gpt4 key购买 nike

是否可以在 C++11 中使用没有可复制对象(具有引用实例)的 std::vector?

struct CanNotCopy {
int& intref_;
CanNotCopy(int& i) noexcept : intref_(i) {}
// How do I make move constructor and operator = ?
};

std::vector<CanNotCopy> hoge; // OK
hoge.resize(10); // default constructor required
int j = 123;
hoge[1] = CanNotCopy(j); // copy constructor required

最佳答案

来自 std::vector , 描述 T :

The requirements that are imposed on the elements depend on the actual operations performed on the container. Generally, it is required that element type meets the requirements of MoveConstructible and MoveAssignable, but many member functions impose stricter requirements.

CanNotCopy不可移动或复制,因此不能用作 T .

部分解决方案是使用 std::reference_wrapper<CanNotCopy> 作为元素类型(可复制但不可默认构造):

...is a class template that wraps a reference in a copyable, assignable object. It is frequently used as a mechanism to store references inside standard containers (like std::vector or std::pair) which can not normally hold references.

例如:

std::vector<std::reference_wrapper<CanNotCopy>> hoge;
int j = 19;
CanNotCopy c(j);
hoge.push_back(std::ref(c));
std::cout << hoge[0].get().intref_ << "\n";

resize()不适用于 std::reference_wrapper<CanNotCopy>因为它不是默认可构造的。但是,此解决方案很脆弱,因为对 CanNotCopy 存在生命周期依赖性。引用了 intCanNotCopy 中引用例如,存在悬空引用的风险。

解决方案是使用 std::unique_ptr<CanNotCopy> 作为元素类型(可移动且默认可构造):

std::vector<std::unique_ptr<CanNotCopy>> hoge;
hoge.resize(5);
int j = 19;
hoge[1].reset(new CanNotCopy(j));
std::cout << hoge[1]->intref_ << "\n";

生命周期对 int 的依赖内引用 CanNotCopy仍然存在。

关于c++ - 如何在 C++11 中将 vector 与引用类型实例对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16954974/

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