Определяемые пользователем литералы для шаблона variadic char - PullRequest
1 голос
/ 11 ноября 2011

В последнее время в источниках gcc-trunk реализованы «пользовательские литералы».Скажите пожалуйста, правильно ли я понимаю, что я не могу определить "пользовательские литералы" для шаблона переменной variadic char?

template<char... chars>
int operator"" _call() { return sizeof...(chars); }
...
std::cout << "method"_call;

Up.

Донне понимаю, почему это выражение разрешено:

template<char... chars>
int operator"" _call() { return sizeof...(chars); }
...
std::cout << 12345566_call;

, а это запрещено:

template<char... chars>
int operator"" _call() { return sizeof...(chars); }
...
std::cout << method_call;

?

Какой смысл?

Вверх. это из-за двусмысленности?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 11 ноября 2011

Нет, это не имеет смысла.Строковые литералы передаются в виде operator"" в качестве двух аргументов, и один из них имеет размер, поэтому вам нужно:

size_t operator"" _call(const char*, size_t len) {
    return len;
}

Стандартное время цитаты (2.14.8.5):

5 Если L является литералом с пользовательской строкой , пусть str будет литералом без ud-суффикса и пусть len - количество единиц кода в str (т. Е. Его длина, исключая завершающий нулевой символ).Литерал L обрабатывается как вызов вида

operator "" X (str, len)

. Вариационные шаблонные формы рассматриваются только для пользовательского целочисленного литерала (2.14.8.3) и пользовательский плавающий литерал (2.14.8.4).

Что касается method_call, method не является литералом.

1 голос
/ 11 ноября 2011

method_call является допустимым идентификатором Как, например, some_call или my_call. Теперь представьте, сколько кода будет нарушено, если такие идентификаторы будут переопределены с помощью operator"".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...