为什么这个模板签名不能用作引号的字符串文字?

时间:2016-11-09 18:17:06

标签: c++ c++11 templates user-defined-literals

C ++ 11允许用户定义的模板字符串 - 文字运算符,具有以下模板签名(taken from CppReference;返回类型不需要是double):

template <char...> double operator "" _x();

但是,它似乎仅适用于数字形式,而不是引用形式:

template <char... chs>
std::string operator ""_r()
{
    // ... construct some sort of string and return it
}

// ... 

auto my_str = "abc"_r;  // ERROR (compiler messages copied below)
auto my_num = 123_r;    // NO ERROR

GCC(5.1)和Clang(3.7)都没有给出有用的错误信息。海湾合作委员会说:

error: no matching function for call to ‘operator""_r()’
// printed source elided
note: candidate: template<char ...chs> std::__cxx11::string operator""_r()
// printed source elided
note:   template argument deduction/substitution failed:
// ERROR OUTPUT ENDS HERE
// (nothing is printed here, despite the ':' in the previous line)

Clang简单地说:

error: no matching literal operator for call to 'operator "" _r' with arguments of types 'const char *' and 'unsigned long', and no matching literal operator template

那么为什么模板参数推断失败?为什么文字运算符模板不匹配?

而且,一般来说,是否可以修复用法,以便template <char...>文字运算符可以与非数字字符串一起使用?

2 个答案:

答案 0 :(得分:2)

您不能声明接受可变参数字符包的用户定义字符串文字。这可能会在将来发生变化,但截至目前,这就是它的全部内容。

来自同一个cppreference:

  

对于用户定义的字符串文字,用户定义的文字表达式   被视为函数调用operator "" X (str, len),其中str是   没有 ud-suffix 和len的文字是它的长度,不包括   终止空字符

答案 1 :(得分:1)

Gcc 扩展名允许

template <typename Char, Char...Cs>
std::string operator ""_r()
{
    // ... construct some sort of string and return it
}

Demo