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: リテラル演算子テンプレートの宣言には、空の parameter-declaration-clause が必要であり、その template-parameter-list には、非型テンプレート パラメーター パック (14.5.3) である単一の template-parameter が必要です。文字を入力します。

したがって、標準の行がわからなかったか、GCC がおかしくなりました。このジレンマを解決するのを手伝ってくれませんか? そうでない場合、文字列リテラルから可変個引数テンプレートの引数リストへの変換を実装する他の方法はありますか?

4

2 に答える 2

3

文字列リテラルではリテラル演算子テンプレートを使用できません。数値リテラルでのみ使用できます。

§ 2.14.8 パラ 5:

L がユーザー定義文字列リテラルの場合、str を ud-suffix を除いたリテラルとし、len を str 内のコード単位の数 (つまり、終端の null 文字を除いた長さ) とします。リテラル 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 に答える