can vector包含一个超载运算符的智能指针&?

时间:2013-08-30 09:24:07

标签: c++

例如,我有一个聪明的指针:

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;
.....    

1 个答案:

答案 0 :(得分:3)

在C ++ 03中,没有显式要求容器中的值类型不会重载一元operator&;但是根据23.1p3,存储的对象需要建模CopyConstructible(20.1.3p1,表30)。这反过来要求表达式&t应该产生类型T *的值,表示t的地址。因此允许重载的一元operator&,但前提是它具有“正确”的返回类型并返回正确的值。

您的operator&无效;它应该返回SmartPointer<T> *

在C ++ 11中,这是放松的(通过使用std::addressof),因此一元operator&可以有任何类型并返回任何值。

在标准的所有版本中,complexvalarray的类型参数不得超载一元operator&;这是为了让它们被视为连续存储。