10

c++11 標準は、テンプレート化された共用体について何か述べていますか? ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdfには何も見つかりませんが、それほど注意深く読んでいません。)

私は持っている

template<typename T>
union u {
  T a;
  char b;
};

template<typename T>
u<T> make_u(T t) {
  return { .a = t };
}

int main() {
  return make_u<int>(1).a;
}

このコードにより、、 、および(バージョン 4.8.0 (実験的)) が と言われicpc -std=c++11ます。に置き換えることでこれを回避できます。ただし、ユニオンの最初のメンバーではないフィールドに対してはこれを行うことができませんでした。関連するメンバーがテンプレートに依存しているテンプレート化されたユニオンの最初のメンバー以外のメンバーを選択する方法はありますか? (もちろん、スタックで共用体を宣言し、必要な値に等しいメンバーを設定することはできます。しかし、初期化子リストまたは関数でこれを行うことはできませんでした。)error: a designator into a template-dependent type is not allowedg++ -std=c++0xerror: expected primary-expression before ‘.’ tokeng++ -std=c++11internal compiler error: in lookup_field_1, at cp/search.c:387{ .a = t }tconstexpr

4

1 に答える 1

13

この{ .a = t }構文は非標準の GNU 拡張であるため、他の C++ 機能との相互作用は C++ 標準の範囲外です。

解決策: 標準の C++ を書きます:

u<T> make_u(T t) {
  u<T> r;
  r.a = t;
  return r;
}

編集:私の知る限り、C++ 11では、必要な初期化を行うコンストラクター(必要に応じてconstexpr)をユニオンに与えることができます。例: http://ideone.com/s4GHjU

于 2012-11-17T16:31:38.773 に答える