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: リテラル演算子テンプレートの宣言には、空の parameter-declaration-clause が必要であり、その template-parameter-list には、非型テンプレート パラメーター パック (14.5.3) である単一の template-parameter が必要です。文字を入力します。
したがって、標準の行がわからなかったか、GCC がおかしくなりました。このジレンマを解決するのを手伝ってくれませんか? そうでない場合、文字列リテラルから可変個引数テンプレートの引数リストへの変換を実装する他の方法はありますか?