10

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では可変個引数テンプレート形式を使用できないと思います。

  1. 実際、可変個引数テンプレートフォームを使用して文字列リテラルを解決できない場合はありますか?
  2. もしそうなら、なぜそのような有用な形式のUDLが標準から除外されたのかについて誰かが洞察を持っていますか?
4

2 に答える 2

8

あなたが正しいです。文字列リテラルは可変個引数テンプレート形式では使用できません (§2.14.8/5):

Luser-defined-string-literal の場合、strをud-suffixのないリテラルとし、lenをstr内のコード単位の数 (つまり、終端の null 文字を除いた長さ) とします。リテラルLは次の形式の呼び出しとして扱われます

operator "" X (str, len)

私は提案書をシャッフルしました (私が見つけた最新のものはN2750 でした)、可変個引数テンプレート形式の使用を許可しない理由を見つけることができませんでした。

于 2012-06-04T11:36:43.907 に答える
2

これを可能にする N3599 が gcc と clang に実装されています。

template<class CharT, CharT... chars>
int operator ""_suffix(){
    return 42;
}
于 2016-02-19T13:36:26.067 に答える