Правила перегрузки для пользовательских литералов в c ++ 0x - PullRequest
2 голосов
/ 08 декабря 2010

Я немного озадачен правилами перегрузки,

скажем, есть следующие буквальные операторы,

unsigned long long operator "" _xx(unsigned long long cooked_literal_int); //1
unsigned long long operator "" _xx(const char * raw_literal_string); // 2
unsigned long long operator "" _xx(long double cooked_literal_double); // 3

если определены оба значения: 1, 2 и 3, перегрузка очевидна,

13_xx //call 1
13.5_xx //call 3

, если определены 1 и 2,

13_xx //call 1
13.5_xx //call 2

если определены 2 и 3

13_xx // call 2 or 3??
13.5_xx // call 3

Путаница возникла из-за последнего стандарта c ++ 0x n3225 2.14.8 / 3,

Если L является определяемым пользователем целочисленным литералом, пусть n будет литералом без его суффикса ud. Если S содержит литеральный оператор с параметром типа unsigned long long, литерал L обрабатывается как вызов вида

оператор "" X (n ULL)

В противном случае S должен содержать необработанный литеральный оператор или шаблон литерального оператора (13.5.8), но не оба одновременно. Если S содержит необработанный литеральный оператор, литерал L обрабатывается как вызов вида

оператор "" X ("n")

В противном случае (S содержит шаблон буквального оператора), L обрабатывается как вызов вида

оператор "" X <’c1’, ’c2’, ... ’ck’> ()

где n - исходная последовательность символов c1c2 ... ck.

Это говорит о том, что, если присутствует 1 (длинный длинный параметр без знака), 13_xx вызовет 1, в противном случае 13_xx вызовет 2. И из 13.5.8,

В частности, они выглядят как обычные функции и шаблоны функций и они следуют тем же правилам разрешения перегрузки.

Насколько я понимаю, если 1 не присутствует, 13_xx можно неявно преобразовать в double и вызвать 3.

Поэтому, если 1 не указан, оба значения 2 и 3 являются действительными из стандартного описания.

Надеюсь, кто-нибудь поможет мне прояснить мои сомнения. Большое спасибо.

1 Ответ

4 голосов
/ 08 декабря 2010

Я полагаю, что 13.5.8 / 7 проясняет эту проблему:

Примечание: литеральные операторы и шаблоны литеральных операторов обычно вызываются неявно через пользовательские литералы (2.14.8).Однако , за исключением ограничений, описанных выше , это обычные функции области имен и шаблонов функций.В частности, они выглядят как обычные функции и шаблоны функций и следуют тем же правилам разрешения перегрузки.

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

Так что я думаю, что если определены 2 и 3, 13_xx вызывает 2 (оператор необработанного литерала).

...