Re: Перегрузка operator& и переносимость
От: MaximE Великобритания  
Дата: 25.07.03 21:21
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

SS>Возникла проблема с переносом проекта из одной реализации C++ в другую (из C++Builder5 на C++Builder6). Проблема заключается в следующем: в проекте интенсивно используется тип vector<TComInterface<Ixxxx> >; TComInterface — это смарт-указатель, у которого определен operator&; в C++Builder6 возникает ошибка компиляции, связанная с тем, что реализация vector-а (STLPort) для получения итераторов применяет operator& к элементам контейнера. В C++Builder5 использовалась другая реализация STL (от Rogue Wave), поэтому таких ошибок не возникало.

SS>Вопросы, собственно, в следующем:
SS> 1. кто ошибся? автор STL, который не учёл возможность изменения семантики оператора & у элементов контейнера? Или ошибся я, создав непереносимый код?

Видимо, автор STL (пусть гуру меня поправят). От элементов контейнера требуется лишь copy-constructable and assignable и деструктор, не кидающий исключений.

SS> 2. как малой кровью решить мою проблему?


не отвечу

SS> 3. как без reinterpret_cast-ов взять адрес переменной, у типа которой определён operator&.


похоже, что только с reinterpret_cast<>.

См. <boost/utility/addressof.hpp>

template <typename T>
T* addressof(T& v)
{
  return reinterpret_cast<T*>(
       &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.