Можно ли использовать union для разных названий переменных?
Например, я хочу сделать pair с нормальными именами, а не first и second. Возможно ли такое использование объединений для дачи разных имён членам?
#include <iostream>
struct pair {
union {
int first;
int key;
int k;
};
union {
int second;
int value;
int val;
int v;
};
} p{1, 2};
int main() {
std::cout << p.first << p.second << '\n';
std::cout << p.key << p.val << '\n';
std::cout << p.k << p.v << '\n';
return sizeof(p);
}
Ответы (1 шт):
Во-первых, формально это приводит к UB (чтение из неактивного поля union-а, независимо от того, совпадает ли его тип с типом активного поля). Не уверен, насколько вредно это на практике.
Во-вторых, как только в union попадает тип с нетривиальным дефолтным/копирующим/перемещающим конструктором, оператором присваивания или деструктором, для всего класса они не будут генерироваться автоматически, и их нужно будет писать вручную.
А это муторно. Например, если конструктор поля кинет исключение, нужно не забыть разрушить все уже созданные поля.
В-третьих, это кажется мне ошибкой проектирования класса. Если вашим классом будет пользоваться больше одного человека, то в коде будет каша из разных названий полей.
Как проектировщик класса, вы должны выбрать за пользователя (т.е. за программиста) единственное правильное название.