从std::vector
, 描述T
:
对元素施加的要求取决于对容器执行的实际操作。一般要求元素类型满足 MoveConstructible 和 MoveAssignable 的要求,但很多成员函数的要求更严格。
CanNotCopy
不可移动或可复制,因此不能用作T
.
部分解决方案是std::reference_wrapper<CanNotCopy>
用作元素类型(可复制但不可默认构造),它:
...是一个类模板,它将引用包装在可复制、可分配的对象中。它经常被用作在标准容器(如 std::vector 或 std::pair)中存储引用的机制,这些容器通常不能保存引用。
例如:
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
引用和int
引用存在生命周期依赖关系,CanNotCopy
存在悬空引用的风险。
一种解决方案是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
仍然存在。