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;
}

此代码导致icpc -std=c++11say error: a designator into a template-dependent type is not allowedg++ -std=c++0xto sayerror: expected primary-expression before ‘.’ tokeng++ -std=c++11(version 4.8.0 (experimental)) to say internal compiler error: in lookup_field_1, at cp/search.c:387。我可以通过替换来解决这个{ .a = t }问题t。但是,对于不是联盟的第一个成员的字段,我不能这样做。有没有办法选择模板联合中的第一个成员以外的其他成员,其中相关成员依赖于模板?(当然,我可以在堆栈上声明一个联合,并将成员设置为我想要的值。但我不能在初始化列表或constexpr函数中这样做。)

4

1 回答 1

13

{ .a = t }语法是非标准的 GNU 扩展,因此它与其他 C++ 功能的交互超出了 C++ 标准的范围。

解决方案:编写标准C++:

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

编辑:AFAIK,在 C++11 中,你可以给你的联合一个构造函数(如果你喜欢的话,一个 constexpr)来完成你需要的初始化。示例:http: //ideone.com/s4GHjU

于 2012-11-17T16:31:38.773 回答