Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Почему тип не активного члена юниона??  [new]
Плюсист
Member

Откуда:
Сообщений: 3
В стандарте написано что можно читать активный член юниона через совместимую неактивную структуру и тогда код будет вести себя так, как если бы я именовал активный член.
Я пишу код, чтобы проверить это, но, похоже, что в компиляторе баг, выводит 0. Может кто-нибудь его зарепортить?
#include <iostream>
#include <typeinfo>

struct T1 { enum E1 : int {} a; };
struct T2 { enum E2 : int {} b; };
union U { T1 t1; T2 t2; };

void f(U& u)
{
	auto x = u.t2.b; // если активен u.t1, u.t2.b заменяется на u.t1.a
	
	std::cout << (typeid(x) == typeid(u.t1.a)) << std::endl; // должно вывести 1
}

int main()
{
	U u { {} }; // активный член u.t1
	f(u);
}


К сообщению приложен файл. Размер - 61Kb
11 май 20, 05:34    [22130442]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
petrav
Member

Откуда:
Сообщений: 2075
Плюсист,

Не очень понятно что вас удивляет. Вы хотите что бы у вас при выполнении типы изменялись?
11 май 20, 08:15    [22130463]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
Плюсист
Member

Откуда:
Сообщений: 3
petrav,

разве стандарт к этому не обязывает?
11 май 20, 08:50    [22130468]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
petrav
Member

Откуда:
Сообщений: 2075
Плюсист
petrav,

разве стандарт к этому не обязывает?

У меня не очень с англ. Но я уверен вы неправильно поняли стандарт. То что вы хотите вообще не возможно, никак. У вас объединение из двух структур, типы разные. После компиляции всё прибито гвоздями и там ничего не поменяется от того как вы переменную инициализируете.
11 май 20, 08:59    [22130470]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
petrav
Member

Откуда:
Сообщений: 2075
Плюсист,

Может у вас стандарт на C++.NET, а компилятор для C++ ? :) Тогда может быть. Я даже не понимаю что такое "активный член объединения". Там в рантайме нет никакой информации какой член активен, а какой пассивен. :)
11 май 20, 09:06    [22130472]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
mayton
Member

Откуда: loopback
Сообщений: 46320
А что тут происходит?

U u { {} }; // активный член u.t1
11 май 20, 13:05    [22130536]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6491
mayton
А что тут происходит?

U u { {} }; // активный член u.t1

Default-инициализация первого члена.
(В C++ можно только первого инициализировать до C++20)
11 май 20, 13:24    [22130545]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
petrav
Member

Откуда:
Сообщений: 2075
Anatoly Moskovsky
mayton
А что тут происходит?

U u { {} }; // активный член u.t1

Default-инициализация первого члена.
(В C++ можно только первого инициализировать до C++20)

А в С++ 20 ? Неужели они позаимствовали из Си инициализацию?

MyStruct s = { .MyValue = 0 };
11 май 20, 13:26    [22130547]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6491
petrav
А в С++ 20 ? Неужели они позаимствовали из Си инициализацию?

Собирались. Не помню точно.
11 май 20, 14:27    [22130566]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6491
https://en.cppreference.com/w/cpp/language/aggregate_initialization
11 май 20, 14:28    [22130568]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
mayton
Member

Откуда: loopback
Сообщений: 46320
Anatoly Moskovsky
mayton
А что тут происходит?

U u { {} }; // активный член u.t1

Default-инициализация первого члена.
(В C++ можно только первого инициализировать до C++20)

Я не о том.

Откуда тут должна появиться единица?
11 май 20, 14:32    [22130571]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2101
mayton
Anatoly Moskovsky
пропущено...

Default-инициализация первого члена.
(В C++ можно только первого инициализировать до C++20)

Я не о том.

Откуда тут должна появиться единица?

#include <iostream>
#include <typeinfo>

struct T1 { enum E1 : int {} a; };
struct T2 { enum E2 : int {} b; };
union U { T1 t1; T2 t2; };

void f(U& u)
{
	auto x = u.t2.b; // если активен u.t1, u.t2.b заменяется на u.t1.a
	
	std::cout  << std::boolalpha << (typeid(x) == typeid(u.t1.a)) << std::endl; // должно вывести 1
}

int main()
{
	U u { {} }; // активный член u.t1
	f(u);
}
11 май 20, 15:03    [22130593]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6491
mayton
Откуда тут должна появиться единица?

Результат сравнения либо true либо false.
В данном случае ТС ожидает true ))
11 май 20, 15:04    [22130594]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
Плюсист
Member

Откуда:
Сообщений: 3
petrav
Может у вас стандарт на C++.NET
Нет
13 май 20, 04:04    [22131736]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
a guest
Member

Откуда:
Сообщений: 255
Anatoly Moskovsky
Default-инициализация первого члена.
Ты точно знаешь что такое default-initialization?
13 май 20, 06:09    [22131752]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2101
a guest
Anatoly Moskovsky
Default-инициализация первого члена.
Ты точно знаешь что такое default-initialization?

расскажи свою версию.
13 май 20, 10:46    [22131836]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
a guest
Member

Откуда:
Сообщений: 255
OoCc
a guest
пропущено...
Ты точно знаешь что такое default-initialization?

расскажи свою версию.
Нет никаких версий. Есть однозначеное определение.
13 май 20, 11:00    [22131847]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
mayton
Member

Откуда: loopback
Сообщений: 46320
Джентльмены. Прошу писать конструктивно.
13 май 20, 11:05    [22131853]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
a guest
Member

Откуда:
Сообщений: 255
mayton
Джентльмены. Прошу писать конструктивно.
Ты сам задал тут оффтопный нубский вопрос. Мы его развиваем.
13 май 20, 11:08    [22131857]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
mayton
Member

Откуда: loopback
Сообщений: 46320
Ну шикарно. Я все равно вас попрошу писать полезную инфу для читающих этот форум. Для бесполезной - есть другие.
13 май 20, 11:12    [22131861]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
a guest
Member

Откуда:
Сообщений: 255
mayton
Ну шикарно. Я все равно вас попрошу писать полезную инфу для читающих этот форум. Для бесполезной - есть другие.
Вот как ты думаешь. Называть не-default-initialization default-инициализацией это полезная инфа?
13 май 20, 11:19    [22131867]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
mayton
Member

Откуда: loopback
Сообщений: 46320
Я никак не думаю. Я-же не участник спора который звучал выше.
13 май 20, 11:58    [22131908]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2101
a guest
OoCc
пропущено...

расскажи свою версию.
Нет никаких версий. Есть однозначеное определение.

И? Давай продолжай.
13 май 20, 12:06    [22131919]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2101
a guest
mayton
Ну шикарно. Я все равно вас попрошу писать полезную инфу для читающих этот форум. Для бесполезной - есть другие.
Вот как ты думаешь. Называть не-default-initialization default-инициализацией это полезная инфа?

Ты неправ.
13 май 20, 12:07    [22131921]     Ответить | Цитировать Сообщить модератору
 Re: Почему тип не активного члена юниона??  [new]
a guest
Member

Откуда:
Сообщений: 255
OoCc
a guest
пропущено...
Вот как ты думаешь. Называть не-default-initialization default-инициализацией это полезная инфа?

Ты неправ.
Пруф?
13 май 20, 12:14    [22131925]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / C++ Ответить