是否可以对基于字符串的用户定义文本进行强类型化



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形式被排除在标准之外?

你是对的。字符串文本不能与可变参数模板形式一起使用 (§2.14.8/5):

如果L用户定义的字符串文字,则让 str 成为文字 不带其 ud 后缀,让 len 是代码单元的数量 str(即,其长度不包括终止空字符)。文本L被视为表单的调用

operator "" X (str, len)

我已经翻阅了提案文件(我能找到的最新文件是 N2750),找不到不允许使用可变参数模板形式的解释。

允许

这样做的N3599已经在gcc和clang中实现。

template<class CharT, CharT... chars>
int operator ""_suffix(){
    return 42;
}

最新更新