Какова цель оператора унарного плюса в массиве char?
Что делает следующее? Я думал, что + для целых рекламных акций.
char c[20] = "hello";
foo(+c);
foo(+"hello");
Ответ 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
Ответ 2
Unary + определяется не только для числовых типов, но и для типов указателей. Однако для массивов он не определен.
Итак, foo(+c) принудительно преобразует c в указатель на свой первый элемент. Если foo - это функция, определенная как принимающая a char *, это было бы необязательно: это уже произойдет неявно. Это может иметь значение, если у вас есть перегрузки (возможно, через функцию шаблона).