Я немного озадачен правилами перегрузки,
скажем, есть следующие буквальные операторы,
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 являются действительными из стандартного описания.
Надеюсь, кто-нибудь поможет мне прояснить мои сомнения. Большое спасибо.