带有构造函数参数的unique_ptr到static *的static_cast

时间:2018-05-11 14:00:45

标签: c++ smart-pointers unique-ptr static-cast

通过将参数传递给构造函数,我在制作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;
}

1 个答案:

答案 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写入原始指针。