转换 unique_ptr 的类型安全吗?
Is it safe to convert type of a unique_ptr?
template <class T> class Foo {};
class Manager {
std::unordered_map<size_t, std::unique_ptr<std::vector<void *>>> _mFoos;
public:
template <class T> void addFoo(Foo<T> &foo) {
int x = typeid(T).hash_code();
// Safe ? :
auto &p = *(reinterpret_cast<std::unique_ptr<std::vector<Foo<T>>> *>(&_mFoos[x]));
if (p == nullptr) {
p.reset(new std::vector<Foo<T>>);
}
auto &foos = *p;
foos.push_back(foo);
};
template <class T> Foo<T> &getFoo(int index) {
int x = typeid(T).hash_code();
auto it = _mFoos.find(x);
auto &foos = *(reinterpret_cast<std::vector<Foo<T>> *>(it->second.get()));
return foos[index];
};
};
如果 T 和 T2 是两种不同的类型,reinterpret_cast a unique_ptr< T > 在 unique_ptr< T2 > 中是否安全且可移植?它们具有相同的大小和相同的位模式吗?
没有
根据严格的别名规则,不相关类型之间的转换(并且不同的模板实例是不相关的类型)是未定义的行为。
(sidenote Apparently I'm required to state the obvious: don't reinterpret_cast, please. See 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) in the specialization for arrays behave the same as the constructors that take a pointer parameter in
the primary template except that they will only participate in overload resolution if either
U
is the same type as pointer, or
pointer is the same type as element_type*
and U
is some pointer type V*
such that V(*)[]
is implicitly convertible to element_type(*)[]
.
正常规则适用;如果 unique_ptr
是用该类型的指针构造的,则只能将 .get()
的结果 reinterpret_cast
转换为该类型。
转换为任何其他类型的行为未定义。
template <class T> class Foo {};
class Manager {
std::unordered_map<size_t, std::unique_ptr<std::vector<void *>>> _mFoos;
public:
template <class T> void addFoo(Foo<T> &foo) {
int x = typeid(T).hash_code();
// Safe ? :
auto &p = *(reinterpret_cast<std::unique_ptr<std::vector<Foo<T>>> *>(&_mFoos[x]));
if (p == nullptr) {
p.reset(new std::vector<Foo<T>>);
}
auto &foos = *p;
foos.push_back(foo);
};
template <class T> Foo<T> &getFoo(int index) {
int x = typeid(T).hash_code();
auto it = _mFoos.find(x);
auto &foos = *(reinterpret_cast<std::vector<Foo<T>> *>(it->second.get()));
return foos[index];
};
};
如果 T 和 T2 是两种不同的类型,reinterpret_cast a unique_ptr< T > 在 unique_ptr< T2 > 中是否安全且可移植?它们具有相同的大小和相同的位模式吗?
没有
根据严格的别名规则,不相关类型之间的转换(并且不同的模板实例是不相关的类型)是未定义的行为。
(sidenote Apparently I'm required to state the obvious: don't reinterpret_cast, please. See 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) in the specialization for arrays behave the same as the constructors that take a pointer parameter in the primary template except that they will only participate in overload resolution if either
U
is the same type as pointer, or pointer is the same type aselement_type*
andU
is some pointer typeV*
such thatV(*)[]
is implicitly convertible toelement_type(*)[]
.
正常规则适用;如果 unique_ptr
是用该类型的指针构造的,则只能将 .get()
的结果 reinterpret_cast
转换为该类型。
转换为任何其他类型的行为未定义。