通过将参数传递给构造函数,我在制作static_cast
unique_ptr
的{{1}}时遇到问题。特别是,您在void *
。
解决方案在编译时非常重要,智能指针的类型必须与堆叠对象的类型相同。
任何解决方案?
object3
结果:
class Test {
public:
Test(){}
Test(int n) : num(n) {}
int num;
};
template<typename T>
class Object {
public:
Object(T&& v) : value(static_cast<T*>(std::move(&v))) {}
Object(const T& v) : value(static_cast<T*>(&v)) {}
Object(std::unique_ptr<T>&& v) : value(static_cast<std::unique_ptr<T>*>(std::move(&v))) {}
Object(const std::unique_ptr<T>& v) : value(static_cast<std::unique_ptr<T>*>(&v)) {}
T* operator->() { return static_cast<T*>(value); }
private:
void* value;
};
int main(int argc, char *argv[]) {
Object<Test> object1 = Test(1);
cout << object1->num << endl; // print 1
Object<Test> object2 = Test();
object2->num = 2;
cout << object2->num << endl; // print 2
Object<Test> object3 = std::make_unique<Test>(3);
cout << object3->num << endl; // print 0 ¿?¿?¿?
Object<Test> object4 = std::make_unique<Test>();
object4->num = 4;
cout << object4->num << endl; // print 4
return 0;
}
答案 0 :(得分:0)
您注意到的是未定义的行为。
unique_ptr的生命周期不是您所期望的。
~/Library/Logs/DiagnosticReports/
你创建一个临时的unique_ptr,之后在构造函数中你获取那个临时的地址。
Object<Test> object3 = std::make_unique<Test>(3);
cout << object3->num << endl; // print 0 ¿?¿?¿?
在此语句中,您获取该unique_ptr的地址,然后移动该指针。 对于原始指针,没有额外的影响。
对于所有其他语句,您可以获得相同的意外结果,因为所有语句都使用临时语句。
请注意,您还将unique_ptr中的reinterpret_cast写入原始指针。