Дефинирани от потребителя литерали за 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
Знам за този вариант. Но очаквах variadic char шаблон. - person niXman; 11.11.2011
comment
@niXman: Това не е вариант. Така е определено от стандарта. Само дефинираните от потребителя интегрални и литерали с плаваща запетая ви позволяват да използвате template <char...> форма (така че 12_call ще работи в първия ви фрагмент). - person Cat Plus Plus; 11.11.2011