+
на указателях - это не что иное, как превратить вещи в значения.Иногда это удобно, если вы хотите уничтожить массивы или функции
int a[] = { 1, 2, 3 };
auto &&x = +a;
Теперь x
- это int*&&
, а не int(&)[3]
.Если вы хотите передать x
или +a
шаблонам, это различие может стать важным.a + 0
не всегда эквивалентен, рассмотрим
struct forward_decl;
extern forward_decl a[];
auto &&x = +a; // well-formed
auto &&y = a + 0; // ill-formed
Последняя строка некорректна, потому что для добавления чего-либо к указателю требуется полностью определить тип указателя на класс-указатель (поскольку он продвигается на sizeof(forward_decl) * N
байт).