Определяемые пользователем литералы для шаблона variadic char

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

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

Вверх

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

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;

?

В чем смысл?

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

Спасибо.


person niXman    schedule 11.11.2011    source источник


Ответы (2)


method_call является допустимым идентификатором. Например, some_call или my_call. А теперь представьте, сколько кода было бы сломано, если бы такие идентификаторы могли быть переопределены operator"".

person celtschk    schedule 11.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 не является литералом.

person Cat Plus Plus    schedule 11.11.2011
comment
Я знаю об этом варианте. Но я ожидал шаблона с переменным числом символов. - person niXman; 11.11.2011
comment
@niXman: это не вариант. Так это определено стандартом. Только определяемые пользователем целочисленные литералы и литералы с плавающей запятой позволяют использовать форму template <char...> (так что 12_call будет работать в вашем первом фрагменте). - person Cat Plus Plus; 11.11.2011