Вариант использования адреса перегрузки оператора
Я думаю, что опасно перегружать адрес оператора &
потому что легко упускать из виду использование std::addressof()
в реализации шаблонов, которые действительно нуждаются в этом. Тем не менее, мне интересно, что было бы правильным вариантом использования перегрузки этого оператора. В частности, есть ли класс (шаблон) в стандартной библиотеке, которая сделала это? Наконец, так как std::addressof()
вводится с C++11, есть ли способ получить адрес объекта, который имеет эту перегрузку в C++03?
2 ответа
&
часто перегружается при создании классов интеллектуальных указателей, поскольку это облегчает их использование: чаще всего вам нужен пустой управляемый указатель, а не адрес объекта интеллектуального указателя.
Пренебрегая эволюционной заводью, которая была std::auto_ptr
классы интеллектуальных указателей, такие как std::unique_ptr
а также std::shared_ptr
были введены в стандарт с C++11. std::addressof
был введен в этот стандарт, поскольку иногда требуется получение реального адреса объекта.
Возможная реализация std::addressof
тривиален, но пахнет из-за требуемого количества отливки; возможная реализация1
template< class T >
T* addressof(T& arg)
{
return reinterpret_cast<T*>(
&const_cast<char&>(
reinterpret_cast<const volatile char&>(arg)));
}
Другие более экзотические варианты использования перегрузки &
предназначены для поддержки грамматических парсеров EBNF. Boost Spirit делает это с удивительной живостью.
1 Цитата из http://en.cppreference.com/w/cpp/memory/addressof
Нет, единственный способ std::addressof()
в C++11 или более поздней версии, или его реализация для более ранних версий, см. выше:
template< class T >
T* addressof(T& arg)
{
return reinterpret_cast<T*>(
&const_cast<char&>(
reinterpret_cast<const volatile char&>(arg)));
}