Говорит ли стандарт С++ 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++11
сказать error: a designator into a template-dependent type is not allowed
, g++ -std=c++0x
сказать error: expected primary-expression before ‘.’ token
и g++ -std=c++11
(версия 4.8.0 (экспериментальный)), чтобы сказать internal compiler error: in lookup_field_1, at cp/search.c:387
. Я могу обойти это, заменив { .a = t }
на t
. Однако я не мог сделать это для полей, которые не являются первым членом союза. Есть ли способ выбрать какой-то член, отличный от первого, в шаблоном союзе, где соответствующий член зависит от шаблона? (Я мог бы, конечно, объявить объединение в стеке и установить член равным требуемому мне значению. Но я не мог сделать этого в списке инициализаторов или в функции constexpr
.)