2

簡易版

class C {
 public:
 static constexpr std::array<C, 2> foo {{"1"_C, "2"_C}};
 int x;
 constexpr C(char c) { x=c; }
}
constexpr C operator"" _C(const char * str, size_t n) { return C(*str); }

配列が定義されている行ではリテラルが理解されないため、これはうまくいきません。ただし、Cが不明なため、フリーリテラル関数を先に移動することはできません。

可変個引数テンプレートまたはそのような恐ろしいものをコードに追加することを含まない、このゴーディアンノットの解決策はありますか?

4

1 に答える 1

3

問題は実際にはユーザー定義のリテラルにあるのではなく、std::array完全な型を必要とするという事実にあります(または実際には、constexpr初期化には問題があります)。次のコードもコンパイルに失敗します。

#include <array>

class C {
public:
 static constexpr std::array<C, 2> foo {{C('1'), C('2')}};
 int x;
 constexpr C(char c) : x(c) {} // please use a mem-initializer-list
};

(ここではClang 3.3 SVN)と同様のエラーがあります:

/ usr / include / c ++ / v1 / array:136:16:エラー:フィールドの型が不完全です'value_type'
      (別名「C」)
    value_type __elems _ [_ Size> 0?_サイズ:1];
               ^
t.cpp:5:36:注:テンプレートクラス'std :: __ 1::array'のインスタンス化
      ここでリクエスト
 static constexpr std :: array <C、2> foo {{C( '1')、C( '2')}};
                                   ^
t.cpp:3:7:注:「C」の定義は、「}」を閉じるまで完了しません。
クラスC{
      ^
于 2012-12-04T01:26:25.697 に答える