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
从阅读开始,我猜测variadic-template表单不适用于从字符串文字派生的UDL。
答案 0 :(得分:8)
你是对的。字符串文字不能与可变参数模板形式(§2.14.8/ 5)一起使用:
如果
L
是用户定义的字符串文字,请将 str 作为文字 没有 ud-suffix ,让 len 成为代码单元的数量 str (即,其长度不包括终止空字符)。文字L
被视为表格的调用operator "" X (str, len)
我已经拖延了提案文件(我可以找到的最新文件是N2750)并且无法找到不允许使用可变参数模板表单的解释。
答案 1 :(得分:2)
N3599允许这样做,已在gcc和clang中实现。
template<class CharT, CharT... chars>
int operator ""_suffix(){
return 42;
}