Новая определяемая пользователем буквальная концепция в С++ предлагает некоторые очень интересные применения строковых литералов, например:
"Goodbye %s world"_fmt("cruel");
"Goodbye %s world"_fmt(123); // Error: arg 1 must be convertible to const char*
R"(point = \((\d+), (\d+)\))"_re; // Builds DFA at compile-time.
typedef table<
column<"CustId"_name , std::string>,
column<"FirstName"_name, std::string>,
column<"LastName"_name , std::string>,
column<"DOB"_name , date >
> Customer;
Однако, когда я строю эти типы конструкций в gcc, например:
template <char... Chars> Name<Chars...> operator "" _name() {
return Name<Chars...>();
}
auto a = 123_name; // OK
auto b = "abc"_name; // Error
Я получаю следующую ошибку:
…unable to find string literal operator ‘operator"" _name’ with ‘const char [4]’, ‘long unsigned int’ arguments
Отчитываясь, я предполагаю, что форма вариационного шаблона недоступна для UDL, полученных из строковых литералов.
- Действительно ли это, что строковые литералы не могут быть решены с использованием формы вариационного шаблона?
- Если да, то кто-нибудь может понять, почему такая полезная форма UDL была оставлена вне стандарта?