2013-08-30 3 views
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; 
.....  
+0

Я не понимаю, почему это не должно быть безопасным? 'vector' являются шаблонами, поэтому все, что вы делаете, будет основано на шаблоне, должно быть таким же безопасным, как и все остальное. –

+7

Зачем вам это делать? Если 'p' был нормальным указателем, вы бы не ожидали, что' & p' вернет указатель. Предоставление перегруженным операторам различной семантики - хороший способ вызвать ошибки позже. –

+0

Если для реализации 'std :: vector' требуется внутренний указатель на свои данные, я бы ожидал, что он будет использовать' std :: addressof' или 'allocator :: address' для его получения. – Angew

ответ

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&; это позволяет им относиться как к непрерывному хранению.

Смежные вопросы