Перегрузка унарного оператора

Рассмотрим класс с перегруженным унарным оператором & (Address-of). Будь как будет class A

template <class C>
class A
{
public:
    C * operator &()
    {
        return &data;
    }
    //...
private:
    C data;
}

Теперь я хочу передать в некоторую функцию указатель типа A заполнить его data, Давайте называть это f

void f(A * auto_containter)
{
    //...
}

Но понятно, почему приведенный ниже код не будет работать (даже не будет компилироваться). Это потому, что перегруженный оператор вызывается.

A a;
f(&a);

Вопрос следующий:

Есть ли синтаксис для передачи адреса a в f? Если нет, то для меня очень странно, почему допускается перегрузка одинарной operator &потому что это делает код более глючным и трудным для понимания. Или есть другие причины?

6 ответов

Решение

Использование boost::addressof функция. В любом случае перегрузка одинарная и весьма сомнительная. Почему это вместо именованной функции, которая возвращает адрес ваших данных?

Есть ли синтаксис для передачи адреса a в f?

Да, уродливый синтаксис:

f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );

boost::addressof хороший и общий обертка вокруг него.

Есть ли синтаксис для передачи адреса от а до F?

Другие уже указали boost::addressof, Механизм, на который он опирается, является стандартно гарантированным использованием встроенного адресного оператора для reinterpret_cast на ссылочный тип. Функция Boost просто оборачивает довольно многословную и неуклюжую комбинацию приведений.

Если нет, то для меня очень странно, почему допускается перегрузка унарного оператора &, потому что если это сделает код более глючным и трудным для понимания. Или есть другие причины?

В некоторых случаях это может быть более удобным. Например, класс интеллектуального указателя может предлагать пользовательский оператор адреса для поддержки записи &p в качестве фактического аргумента T** формальный аргумент. Тем не менее, я думаю, что в настоящее время общепризнанно, что это не слишком хорошая идея.

Ура & hth.,

Зачем вам перегружать унар operator&?

Помимо этого, есть boost::addressof,

Вот почему boost::addressof было изобретено.

Ваш сценарий никогда не подходит, потому что любой, кто пишет эту функцию, будет использовать ссылку, а не указатель. Кроме того, вы забыли создать экземпляр типа A с примером типа C.

Другие вопросы по тегам