例如,我有一个聪明的指针:
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;
.....
答案 0 :(得分:3)
在C ++ 03中,没有显式要求容器中的值类型不会重载一元operator&
;但是根据23.1p3,存储的对象需要建模CopyConstructible
(20.1.3p1,表30)。这反过来要求表达式&t
应该产生类型T *
的值,表示t
的地址。因此允许重载的一元operator&
,但前提是它具有“正确”的返回类型并返回正确的值。
您的operator&
无效;它应该返回SmartPointer<T> *
。
在C ++ 11中,这是放松的(通过使用std::addressof
),因此一元operator&
可以有任何类型并返回任何值。
在标准的所有版本中,complex
和valarray
的类型参数不得超载一元operator&
;这是为了让它们被视为连续存储。