Шаблонные союзы в C ++ 11

Говорит ли стандарт 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 функция).

10

Решение

{ .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

13

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]