1

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

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

1 回答 1

3

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

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

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

在标准的所有版本中,complexand的类型参数valarray不能重载 unary operator&;这是为了让它们被视为连续存储。

于 2013-08-30T12:40:15.213 回答