Ответ 1
Он заставляет массив распадаться на указатель, как это косвенно указано в п. 5.3.1 [expr.unary.op]/7:
Операнд унарного + оператора должен иметь арифметическое, неперечисленное перечисление или тип указателя, а результатом является значение аргумента. Интегральное продвижение выполняется на интегральных или перечисляющих операндах. Тип результата - тип продвинутого операнда.
Сначала вы можете не видеть его, но поскольку массив не является одним из перечисленных типов, он должен быть преобразован в указатель, чтобы соответствовать. Оттуда возвращается значение указателя.
В обоих случаях a foo(const char *)
выбирается над foo(const char(&)[N])
. Для некоторых примеров полезных вещей вы можете использовать унарный плюс, см. этот ответ. Включено преобразование типа перечисления в целое число и устранение проблемы связывания. Как вы говорите, его также можно использовать для цельной рекламы. Например, unsigned char byte = getByte(); std::cout << +byte;
будет печатать числовое значение и никогда не будет символом.
Простым примером является:
char a[42];
cout << sizeof(a) << endl; // prints 42
cout << sizeof(+a) << endl; // prints 4