Меня наконец-то допустили до 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 из примера выше)?