C++unique_ptr作为成员的模板的构造函数失败
Constructor of C++ Template with unique_ptr as member fails
当类模板包含对另一个类的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
修复使程序运行良好。
相关文章:
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在构造函数中分配内存失败是如何冒泡的
- 函数返回时,带指针的复制构造函数失败
- MPICH 的 MPI_Comm_dup() 在复制构造函数中失败
- 引用构造函数时链接失败
- 类模板在其构造函数中的模板变量推导失败
- 构造函数SFINAE和继承在clang中失败
- 为什么即使直接构造函数有效,template_back也会失败
- 在 if 语句中调用重载构造函数失败
- 继承的构造函数,在 clang++3.9 中编译,在 g++ 7 中失败
- C++模板化类默认构造函数失败
- STD :: MAP EMPLECE通过显式构造函数失败
- 打开不存在的文件时如何使流构造函数失败?
- 复制构造函数失败..重载,动态分配
- 如何处理 RAII 的构造函数失败
- C++unique_ptr作为成员的模板的构造函数失败
- 如何使用new(std::nothrow)使构造函数失败
- 在stl列表中调用构造函数失败
- 尽管类名与C++完全匹配,但模板基类初始化构造函数失败
- 尝试在类成员初始化中使用 vector 的填充构造函数失败。怎么了?