C++20 пользоватеский строковый литерал
От: B0FEE664  
Дата: 13.08.25 16:29
Оценка:
Меня наконец-то допустили до C++20 и вот...
думаю, что наконец-то смогу определять свои суффиксы ""_compile_time
Смотрю на нововведение здесь:
3) For user-defined string literals, let str be the literal without ud-suffix:
a) If the overload set includes a string literal operator template with a constant template parameter for which str is a well-formed template argument, then the user-defined literal expression is treated as a function call operator ""X<str>();

и несколько удивляюсь от там приведённого примера:

template<std::size_t N>
struct DoubleString
{
    char p[N + N - 1]{};
 
    constexpr DoubleString(char const(&pp)[N])
    {
        std::ranges::copy(pp, p);
        std::ranges::copy(pp, p + N - 1);
    }
};
 
template<DoubleString A>
constexpr auto operator""_x2()
{
    return A.p;
}

std::cout << "abc"_x2 << '\n';


Классно, думаю, загнули, но мне, надо попроще... и никак проще не получается.
Вопрос, короче, такой.
Допустим у нас есть функция:
template <auto>
constexpr auto fun()
{
    return 0;
}

И вызов
fun<"asdf">();

тогда — ошибка компиляции. Я ожидал, что для template <class T> auto fun(); T станет const char(&)[N] или что-то в этом роде.

Правильно ли я понимаю, что для строкового литерала никакого встроенного типа введено не было и всегда надо добавлять свой класс (вроде DoubleString из примера выше)?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.