【发布时间】:2021-04-02 10:46:52
【问题描述】:
您如何将std::find_if 之类的算法与唯一指针向量一起使用?例如:
#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>
class Integer {
public:
explicit Integer(int i): i_(i){};
int get() const{
return i_;
}
private:
int i_;
};
using IntegerPtr = std::unique_ptr<Integer>;
int main() {
IntegerPtr p1 = std::make_unique<Integer>(4);
IntegerPtr p2 = std::make_unique<Integer>(5);
IntegerPtr p3 = std::make_unique<Integer>(6);
std::vector<IntegerPtr> vectorOfIntegerPointers({
std::move(p1),
std::move(p2),
std::move(p3),
});
int i = 5;
auto first_index_larger_than_i = std::find_if(vectorOfIntegerPointers.begin(), vectorOfIntegerPointers.end(), [&](IntegerPtr s) {
return s->get() > i;
});
std::cout << first_index_larger_than_i.get() << std::endl;
return 0;
}
失败
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1881:31: error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<Integer, std::__1::default_delete<Integer> >'
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
【问题讨论】:
-
糟糕,谢谢。
-
@Galik 我已经尝试过这种变化,但我得到了同样的错误
-
std::move(p1)将 unqiue_ptr 移动到初始化列表中,但是当调用带有初始化列表的向量的 ctor 时,它会尝试复制列表的所有 unique_ptrs,这是不可能的,因为无法复制 unique_ptr。 -
啊啊我明白了,所以初始化列表不能与
unique_ptrs 一起使用。很高兴知道。感谢您的所有建议,我现在可以正常工作了。如果您发布答案,很高兴接受答案。
标签: c++ algorithm unique-ptr