Говорит ли стандарт 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++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
функция).
{ .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
Других решений пока нет …