Можно ли использовать union для разных названий переменных?

Рейтинг: 3Ответов: 1Опубликовано: 31.05.2023

Например, я хочу сделать 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);
}

Ответы

▲ 5

Во-первых, формально это приводит к UB (чтение из неактивного поля union-а, независимо от того, совпадает ли его тип с типом активного поля). Не уверен, насколько вредно это на практике.

Во-вторых, как только в union попадает тип с нетривиальным дефолтным/копирующим/перемещающим конструктором, оператором присваивания или деструктором, для всего класса они не будут генерироваться автоматически, и их нужно будет писать вручную.

А это муторно. Например, если конструктор поля кинет исключение, нужно не забыть разрушить все уже созданные поля.

В-третьих, это кажется мне ошибкой проектирования класса. Если вашим классом будет пользоваться больше одного человека, то в коде будет каша из разных названий полей.

Как проектировщик класса, вы должны выбрать за пользователя (т.е. за программиста) единственное правильное название.