Я хочу использовать строку внутри Союза. если я пишу ниже
union U
{
int i;
float f;
string s;
};
Компилятор дает ошибку, говоря, что U:: S имеет конструктор копирования.
Я прочитал еще одно сообщение для альтернативных способов решения этой проблемы. Но я хочу знать, почему компилятор не позволяет это в первую очередь?
EDIT: @KennyTM: в любом объединении, если элемент инициализирован, другие будут иметь значения мусора, если ни один из них не инициализирован, все будут иметь значения мусора. Я думаю, что тегированный союз просто обеспечивает некоторый комфорт для доступа к действительным значениям из Союза. Ваш вопрос: как вы или компилятор можете написать конструктор копирования для объединения выше без дополнительной информации? sizeof (string) дает 4 байта. Исходя из этого, компилятор может сравнивать размеры других членов и распределять наибольшее распределение (4 байта в нашем примере). Внутренняя длина строки не имеет значения, поскольку она будет храниться в отдельном месте. Пусть строка имеет любую длину. Все, что должен знать Союз, - это вызов конструктора строк класса string со строковым параметром. В любом случае, как компилятор обнаруживает, что конструктор копирования должен быть вызван в обычном случае, аналогичный метод, который следует соблюдать, даже если строка находится внутри Союза. Поэтому я думаю, что компилятор мог бы сделать, выделите 4 байта. Затем, если для s назначена какая-либо строка, тогда класс string позаботится о распределении и копировании этой строки, используя собственный распределитель. Таким образом, нет никаких шансов на повреждение памяти.
Строка не существует во время разработки Союза в компиляторе? Поэтому ответ мне еще не ясен. Я новый член на этом сайте, если что-то не так, простите меня.