我在 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 变得很奇怪。你能帮我解决这个难题吗?如果没有,是否有任何其他方法可以实现将字符串文字转换为可变参数模板的参数列表?