当类模板包含指向另一个类的 unique_ptr 时,该类的构造函数不会将 unique_ptr 移动到新对象中。 使用相同的类,但没有模板,构造函数按预期生成对象。
#include <iostream>
class test1{
public:
std::string s_;
test1(std::string s):s_(s){};
};
class testu{
public:
std::unique_ptr<test1> us_;
testu(std::unique_ptr<test1> us):us_(std::move(us)){};
};
template <int i>
class testt {
public:
std::unique_ptr<test1> us_;
testt<i>(std::unique_ptr<test1> us):us_(std::move(us)){};
};
template class testt<0>;
int main(int argc, const char * argv[]) {
//without template
std::unique_ptr<test1> us(new test1("test"));
testu* t1=new testu(move(us));
std::cout<<t1->us_->s_<<"\n";
//with template the constructor fails!
std::unique_ptr<test1> ust(new test1("test"));
testt<0>* t2=new testt<0>(std::move(us));
std::cout<<t2->us_->s_<<"\n"; //crash!
return 0;
}
最佳答案
这只是一个错字:
testt<0>* t2 = new testt<0>(std::move(us));
这一行应该是
testt<0>* t2 = new testt<0>(std::move(ust));
us
已经从 main
的第一部分移出,因此倒数第二行的访问无效:
std::cout<<t2->us_->s_<<"\n";
// ^^^
// | Was already moved from, access causes UB
修复 program run fine .
关于c++ - 具有 unique_ptr 作为成员的 C++ 模板的构造函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190665/