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