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

Какова цель оператора унарного плюса в массиве char?

Что делает следующее? Я думал, что + для целых рекламных акций.

char c[20] = "hello";
foo(+c);
foo(+"hello");
4b9b3361

Ответ 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 *, это было бы необязательно: это уже произойдет неявно. Это может иметь значение, если у вас есть перегрузки (возможно, через функцию шаблона).