Вариант использования адреса перегрузки оператора

Я думаю, что опасно перегружать адрес оператора & потому что легко упускать из виду использование 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)));
}
Другие вопросы по тегам