2

我在 GCC 4.8 中尝试了以下代码:

#include <iostream>
using namespace std;

template <typename T, T... vs>
struct integral_list {
    typedef T elem_type;
};
template <typename T, T... vs> 
struct gen_array {
    static const T data[sizeof...(vs)];
};
template <typename T, T... vs> 
const T gen_array<T, vs...>::data[sizeof...(vs)] = { vs... };

template <char... cs>
constexpr auto operator "" _lit() -> integral_list<char, cs...> {
    return declval<integral_list<char, cs...>>();
}

int main() {
    int (& data)[4] = gen_array<char, decltype("abcd"_lit)>::data;
    for (int i = 0; i < 4; ++i)
        cout << data[i] << endl;
}

并得到

tester.cpp:21:48: 错误: 无法使用 'const char [5]'、'unsigned int' 参数找到字符串文字运算符 'operator"" _lit'

而 C++11 标准说

13.5.8.5:文字运算符模板的声明应具有空的参数声明子句,并且其模板参数列表应具有单个模板参数,该模板参数是具有元素的非类型模板参数包(14.5.3)输入字符。

所以要么我没有弄清楚标准线,要么 GCC 变得很奇怪。你能帮我解决这个难题吗?如果没有,是否有任何其他方法可以实现将字符串文字转换为可变参数模板的参数列表?

4

2 回答 2

3

您不能将文字运算符模板与字符串文字一起使用,而只能与数字文字一起使用。

§ 2.14.8 第 5 段:

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

operator "" X (str , len)

尽管如此,可以使用参数字符串进行一些编译时计算。简单的例子,可能作为模型有用:

#include <iostream>

constexpr unsigned long operator"" _mylong(const char* s, size_t l) {
  return l == 0 ? 0UL : (s[l - 1] - '0') + 10 * operator"" _mylong(s, l - 1);
}

int main() {
  std::cout << "1492888888888888"_mylong << std::endl;
  return 0;
}
于 2013-01-24T16:24:51.510 回答
2

在 gcc 4.9 中它是可用的(你可能需要从 SVN 编译它)

http://gcc.gnu.org/ml/gcc-patches/2013-04/msg00998.html

于 2013-06-26T14:33:00.010 回答