Унарный + по указателям - PullRequest
       11

Унарный + по указателям

12 голосов
/ 13 февраля 2012

Я только просматривал черновик стандарта C ++ 11 и нашел следующее удивительное утверждение (§13.6 / 8):

Для каждого типа T существуют операторные функции-кандидаты вида

T* operator+(T*);

Как следует понимать этот "унарный +" оператор для указателя? Это просто не работает в обычном случае, который, тем не менее, может быть перегружен? Или есть какой-то более глубокий момент, который я здесь упускаю?

Ответы [ 3 ]

8 голосов
/ 13 февраля 2012

Ответом на ваш вопрос является просто страница над цитируемой вами цитатой - §13.6 / 1:

Функции-кандидаты, представляющие встроенные операторы, определенные в разделе 5, указаны вэтот подпункт. Эти функции-кандидаты участвуют в процессе разрешения перегрузки оператора, как описано в 13.3.1.2, и не используются ни для каких других целей. [ Примечание: Поскольку встроенные операторы принимают только операнды с неТип класса, и разрешение перегрузки оператора происходит только тогда, когда выражение операнда изначально имеет класс или тип перечисления, разрешение перегрузки оператора может преобразовываться во встроенный оператор, только когда у операнда есть тип класса, который имеет определяемое пользователем преобразование в неТип класса, подходящий для оператора, или когда операнд имеет тип перечисления, который может быть преобразован в тип, подходящий для оператора.Также обратите внимание, что некоторые из функций-кандидатов, приведенных в этом подпункте, являются более разрешающими, чем сами встроенные операторы.Как описано в 13.3.1.2, после того, как встроенный оператор выбран разрешением перегрузки, выражение подчиняется требованиям для встроенного оператора, приведенным в разделе 5, и, следовательно, любым дополнительным семантическим ограничениям, приведенным в нем.Если существует кандидат, написанный пользователем, с тем же именем и типами параметров, что и встроенная операторная функция-кандидат, встроенная операторная функция скрыта и не входит в набор функций-кандидатов. - Конечная заметка ]

8 голосов
/ 14 февраля 2012

+ на указателях - это не что иное, как превратить вещи в значения.Иногда это удобно, если вы хотите уничтожить массивы или функции

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 байт).

0 голосов
/ 13 февраля 2012

Ну, вы можете перегрузить его, делайте что хотите, но это просто для симметрии с унарным оператором. Как вы упоминаете, большую часть времени это просто не работает.

...