【发布时间】:2013-08-30 09:24:07
【问题描述】:
比如我有这样一个智能指针:
template <typename T>
class SmartPointer
{
public:
....
T* operator & () { return m_p; }
private:
T* m_p;
}
void foo()
{
std::vector<SmartPointer<int> >vec;
vec.push_back(....);
vec.resize(.....);
......
}
这种用法安全吗?我在 MINGW4.4 中尝试过,它工作正常....
其实那些代码是用来做COM的,当我想得到一个对象时,我需要做这些
SmpartPointer<COMObj> spObj;
HRESULT hr = xxxxx->QueryInterface(&spObj);
然后我想将指针存储在向量中,所以
std::vector<SmpartPointer<COMObj> >vec;
.....
【问题讨论】:
-
我不明白为什么它不应该是安全的?
vector是模板化的,因此您所做的任何事情都将基于模板,应该和其他任何事情一样安全。 -
你为什么要这样做?如果
p是一个普通指针,您不会期望&p返回该指针。为重载的运算符提供不同的语义是稍后导致错误的好方法。 -
如果
std::vector的实现在内部需要一个指向其数据的原始指针,我希望它使用std::addressof或allocator::address来获取它。 -
我不记得
std::vector的客户端类 not 重载运算符的任何要求,所以我认为这很好。不过,您对运算符重载的使用是一个坏主意的原型。 -
你可能想使用'operator T*()'
标签: c++