矢量可以包含一个智能指针,该指针重载运算符&?

can vector contain a smart pointer which overload operator &?

本文关键字:指针 重载 运算符 智能 包含一      更新时间:2023-10-16

例如,我有这样一个智能指针:

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

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

您的operator&无效;它应该返回CCD_ 8。

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

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