C ++の新しいユーザー定義リテラルの概念は、次のような文字列リテラルの非常に興味深い使用法を示唆しています。
"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が標準から除外されたのかについて誰かが洞察を持っていますか?