转换unique_ptr的类型是否安全?

时间:2015-07-09 14:23:41

标签: c++ casting unique-ptr

SELECT
    id,
    customer.name,
    date
FROM
    customer
INNER JOIN (
    SELECT
        name
    FROM
        customer
    GROUP BY
        name,date
    HAVING
        COUNT(id) > 1
) temp ON customer.name = customer.name
ORDER BY
    name;

reinterpret_cast一个unique_ptr<是否安全且便于携带? T>在unique_ptr< T2>如果T和T2是两种不同的类型?它们具有相同的大小和相同的位模式吗?

3 个答案:

答案 0 :(得分:2)

没有

根据严格的别名规则,在不相关的类型(以及不同的模板实例是不相关的类型)之间进行转换是未定义的行为。

答案 1 :(得分:2)

  

旁注显然我需要说明显而易见的事情:请不要重新解密。请参阅When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

使用shared_ptr,您可以使用

对于unique_ptr,您必须使用move进行转换。 C ++ 17实现了转换构造函数:

template<class U> explicit unique_ptr( U p );

请参阅http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr

  

2-4)在数组的特化中,行为与带有指针参数的构造函数相同   主要模板,除了它们只参与重载解析   U与指针的类型相同,或   指针与element_type*的类型相同,而U是指针类型V*,因此V(*)[]可隐式转换为element_type(*)[]

答案 2 :(得分:0)

适用正常规则;如果reinterpret_cast是使用该类型的指针构建的,那么.get()的结果只能unique_ptr {。}}。

未定义强制转换为任何其他类型的行为。