Подтвердить что ты не робот

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

Рассмотрим класс с перегруженным унарным оператором и (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 &, потому что он делает код более багги и его трудно понять. Или есть другие причины?

4b9b3361

Ответ 1

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

Ответ 2

Есть ли какой-либо синтаксис для передачи адреса от a до f?

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

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

boost::addressof - это хорошая и общая оболочка вокруг него.

Ответ 3

Есть ли какой-либо синтаксис для передачи адреса от a до f?

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

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

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

Приветствия и hth.,

Ответ 4

Почему вы хотите перегрузить унарный operator&?

Кроме того, существует boost::addressof.

Ответ 6

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