Size: a a a

2021 March 15

SS

Sergey Skvortsov in pro.cxx
Alexandr Rudalev
Ну и? Эти объеты не имеют типов? И весь разговор не о приведении типов? Или не о расположении полей описанных в типах?
Стоило перечитать дискуссию сначала, конечно, по третьему кругу повторяем

Только типов объектов недостаточно, чтоб говорить, являются ли они pointer-interconvertible
Например, для struct A { double x; double y; }; A a; объекты a.x и a.y не pointer-interconvertible, а объекты a.x и a.x — pointer-interconvertible
источник

AG

Andrey Glebov in pro.cxx
Вот кстати кейс, где a.x и b.x могут быть pointer-interconvertible: https://eel.is/c++draft/class.mem#general-26
источник

VS

Vlad Serebrennikov in pro.cxx
Andrey Glebov
Вот кстати кейс, где a.x и b.x могут быть pointer-interconvertible: https://eel.is/c++draft/class.mem#general-26
возможность осуществить доступ не означает pointer-interconvertible, если я правильно вас понял
источник

AR

Alexandr Rudalev in pro.cxx
Sergey Skvortsov
Стоило перечитать дискуссию сначала, конечно, по третьему кругу повторяем

Только типов объектов недостаточно, чтоб говорить, являются ли они pointer-interconvertible
Например, для struct A { double x; double y; }; A a; объекты a.x и a.y не pointer-interconvertible, а объекты a.x и a.x — pointer-interconvertible
ну тут a - объект типа A, a.x - объект типа double, a.y - объект типа double. А "объекты a.x и a.y не pointer-interconvertible" - бред
источник

SS

Sergey Skvortsov in pro.cxx
Alexandr Rudalev
ну тут a - объект типа A, a.x - объект типа double, a.y - объект типа double. А "объекты a.x и a.y не pointer-interconvertible" - бред
Можете подробнее раскрыть мысль про бред?
источник

VS

Vlad Serebrennikov in pro.cxx
мне тоже интересно узнать, как a.x и a.y имеют одинаковый адрес, что следует из pointer-interconvertible
источник

AG

Andrey Glebov in pro.cxx
Vlad Serebrennikov
возможность осуществить доступ не означает pointer-interconvertible, если я правильно вас понял
Вот не уверен. Но, судя по https://eel.is/c++draft/basic.compound#4.2 (и п. 4.4), у них есть общий объект union {...} c
источник

AR

Alexandr Rudalev in pro.cxx
Когда вы написали a.y, то выбрали конкретный объект типа double, что вы дальше с ним хотите сделать?
источник

VS

Vlad Serebrennikov in pro.cxx
Andrey Glebov
Вот не уверен. Но, судя по https://eel.is/c++draft/basic.compound#4.2 (и п. 4.4), у них есть общий объект union {...} c
давайте уточним, о pointer-interconvertibility каких двух объектов мы говорим. если о u.t1.a и u.t2.c, то я согласен, причем даже без оговорки на common initial sequence
источник

AG

Andrey Glebov in pro.cxx
Vlad Serebrennikov
давайте уточним, о pointer-interconvertibility каких двух объектов мы говорим. если о u.t1.a и u.t2.c, то я согласен, причем даже без оговорки на common initial sequence
struct A { int a; }
struct B { int b; }
union U {
   A x;
   B y;
} u;
Речь о u.x.a и u.y.b.
источник

VS

Vlad Serebrennikov in pro.cxx
Andrey Glebov
struct A { int a; }
struct B { int b; }
union U {
   A x;
   B y;
} u;
Речь о u.x.a и u.y.b.
да, я согласен, что они pointer-interconvertible (просто ориентировался на пример из class.mem#general-26, который вы привели выше)

но исключительно благодаря union, что не позволяет применить эту логику к общему случаю, который мы изначально рассматривали
источник

ПК

Побитый Кирпич... in pro.cxx
Alexandr Rudalev
ну тут a - объект типа A, a.x - объект типа double, a.y - объект типа double. А "объекты a.x и a.y не pointer-interconvertible" - бред
assert(&a.x != &a.y);
источник

AR

Alexandr Rudalev in pro.cxx
or, if the object has no non-static data members, any base class subobject of that object
источник

ПК

Побитый Кирпич... in pro.cxx
Alexandr Rudalev
or, if the object has no non-static data members, any base class subobject of that object
Что ты этим хочешь сказать? Какие то рандомные фразы выдёргиваешь
источник

AG

Andrey Glebov in pro.cxx
Vlad Serebrennikov
да, я согласен, что они pointer-interconvertible (просто ориентировался на пример из class.mem#general-26, который вы привели выше)

но исключительно благодаря union, что не позволяет применить эту логику к общему случаю, который мы изначально рассматривали
Именно) я как раз хотел показать единственный(?) случай, где объекты A::a и B::b могут оказаться pointer-interconvertible.
источник

SS

Sergey Sobolev in pro.cxx
Sergey Skvortsov
Изначально — можно ли обращаться к struct B { double d; }; через указатель на struct A { double d; };
В дизайне и эволюции языка с++ сам страуструп пишет, что можно
void foo(A *a, B *b) {
a = (A *)b;
a->d = 1;
assert(a->d == b->d)
}
источник

SS

Sergey Sobolev in pro.cxx
По причине одинакового размещения в памяти
источник

VS

Vlad Serebrennikov in pro.cxx
Андрей Руссков
мне кажется что будет затруднительно даже описать на standartese что значит "совпадает layout двух классов"
оказывается, это сделали до нас
http://eel.is/c++draft/class.mem#general-24
источник

VS

Vlad Serebrennikov in pro.cxx
Sergey Sobolev
В дизайне и эволюции языка с++ сам страуструп пишет, что можно
void foo(A *a, B *b) {
a = (A *)b;
a->d = 1;
assert(a->d == b->d)
}
layout-compatible это действительно интересное свойство, которое в этом споре не вспоминали, но из него вытекает лишь то, что pointers to layout-compatible types shall have the same value representation and alignment requirements

по крайней мере ничего иного мне найти не удается. оно вообще редко в стандарте встречается, насколько я могу судить
источник

CD

Constantine Drozdov in pro.cxx
Sergey Sobolev
В дизайне и эволюции языка с++ сам страуструп пишет, что можно
void foo(A *a, B *b) {
a = (A *)b;
a->d = 1;
assert(a->d == b->d)
}
Возможно, Бьорн писал это еще до того, как поняли, что так не надо
источник