Шаблон буквального оператора: почему не строка?

Еще раз, отвечая на другой вопрос, я забыл (по моей вине), что шаблоны литеральных операторов выбираются из набора объявлений только при обнаружении целочисленных или плавающих литералов.

В качестве примера:

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!"

но это плохо взаимодействовало с фазами перевода, и не было известно ни одного убедительного варианта использования этой функции.

Другие вопросы по тегам