是否可以为字符串文字创建模板化的用户定义文字(文字后缀)?

时间:2016-12-01 20:52:08

标签: c++ c++11 templates

当我发现可以模仿用户定义的文字时,我感到很惊讶:

template <char ...C> std::string operator ""_s()
{
    char arr[]{C...};
    return arr;
}

// ...

std::cout << 123_s;

但是上面的声明不适用于字符串文字:

"123"_s

给了我以下错误:

  

prog.cpp:在功能&#39; int main()&#39;:
   prog.cpp:12:15:错误:没有匹配函数来调用&#39;运算符&#34;&#34; _s()&#39;
    std :: cout&lt;&lt; &#34; 123&#34; _s;

     

prog.cpp:4:34:注意:候选人:模板std :: string operator&#34;&#34; _s()
   template std :: string operator&#34;&#34; _s()

     

prog.cpp:4:34:注意:模板参数扣除/替换失败:

(Ideone)

是否有办法将模板化的用户定义文字与字符串文字一起使用?

1 个答案:

答案 0 :(得分:2)

Clang和GCC支持一个允许你做的扩展

template<class CharT, CharT... Cs>
std::string operator ""_s() { return {Cs...}; }

但标准C ++中没有任何内容;标准化这个的提议已经多次提出并且每次都被拒绝,最近不到一个月之前,主要是因为模板参数包是真正低效的表示字符串的方式。