Ответ 1
Используйте функцию boost::addressof
. В любом случае перегрузка унарных и очень сомнительная. Зачем это вместо того, чтобы иметь именованную функцию, которая возвращает адрес ваших данных?
Рассмотрим класс с перегруженным унарным оператором и (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 &
, потому что он делает код более багги и его трудно понять. Или есть другие причины?
Используйте функцию boost::addressof
. В любом случае перегрузка унарных и очень сомнительная. Зачем это вместо того, чтобы иметь именованную функцию, которая возвращает адрес ваших данных?
Есть ли какой-либо синтаксис для передачи адреса от
a
доf
?
Да, есть уродливый синтаксис:
f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );
boost::addressof
- это хорошая и общая оболочка вокруг него.
Есть ли какой-либо синтаксис для передачи адреса от a до f?
Другие уже указали boost::addressof
. Механизм, на который он опирается, является стандартно гарантированным использованием встроенного оператора адресов для типа reinterpret_cast
для ссылочного типа. Функция Boost просто обертывает довольно многословную и неудобную комбинацию бросков.
Если нет, то для меня очень странно, почему разрешено перегружать унарный оператор &, потому что, если сделать код более багги и трудно понять. Или есть другие причины?
В некоторых случаях это может быть более удобно. Например, класс интеллектуального указателя может предложить пользовательский оператор адреса, чтобы поддерживать запись &p
в качестве фактического аргумента формальному аргументу T**
, Тем не менее, я думаю, что в наше время он вообще признал, что это не так, как хорошая идея.
Приветствия и hth.,
Почему вы хотите перегрузить унарный operator&
?
Кроме того, существует boost::addressof
.
Вот почему boost::addressof
был изобретен.
Ваш сценарий никогда не возникает, потому что любой, кто пишет эту функцию, возьмет ссылку, а не указатель. Кроме того, вы забыли создать экземпляр A с примером типа для C.