Шаблон буквального оператора: почему не строка?
Еще раз, отвечая на другой вопрос, я забыл (по моей вине), что шаблоны литеральных операторов выбираются из набора объявлений только при обнаружении целочисленных или плавающих литералов.
В качестве примера:
template <char... C>
constexpr int operator "" _x() {
return 0;
}
Может использоваться как 10_x
, но его нельзя использовать ни как foo_x
ни как "foo"_x.
Помимо очевидной причины, которая заключается в том, что в стандарте говорится, что какова техническая причина (если таковая имеется), по которой они не рассматриваются при работе со строковыми литералами?
Я нашел также предложение для этого (ну, не совсем то же самое, но оно дает идею), но все же это не вариант.
Что мешает их использовать для строк?
1 ответ
Там, где сложности, связанные с набором символов и кодирования и другой такой беспорядок. Что произойдет, если кодировка набора символов отличается во время выполнения и во время компиляции, что произойдет, если существует несколько способов кодирования одного и того же символа, выполняет ли строка, кодируемая utf-8, в отличие от другой кодировки? Вы переводите набор символов во время выполнения или нет?
Может быть, есть простые ответы; но было достаточно осложнений, что авторы предложили "хорошо, мы это урежем", и литералы попали в стандарт.
Символы разрешены для плавающей запятой и целочисленных литералов, где ограничены, и не было этой проблемы.
Но вы связались с документом, который связан с N2750 и в котором прямо сказано:
может возникнуть потребность в "сырой" форме строкового литерала, в которой
"Hello, " L"Worl\u0044!"
отличается от
L"Hello, World!"
но это плохо взаимодействовало с фазами перевода, и не было известно ни одного убедительного варианта использования этой функции.