Size: a a a

2021 April 15

МВ

Макс Воробьев... in dlang.ru
источник

МВ

Макс Воробьев... in dlang.ru
почему после каста к Base as_base указывает  не туда ?
источник

D

Danya in dlang.ru
А ты уверен, что это не адрес переменной?
источник

D

Danya in dlang.ru
А то +8 байт выглядят как смещение указателя
источник

МВ

Макс Воробьев... in dlang.ru
значение d - это тот адрес, который вернул make из cpp
источник

МВ

Макс Воробьев... in dlang.ru
проверенно дебагером
источник

МВ

Макс Воробьев... in dlang.ru
Base as_base = *cast(Base*)(&d);
так все работает
источник

МВ

Макс Воробьев... in dlang.ru
но вызов as_base.test(); - уже сегфолт
источник

МВ

Макс Воробьев... in dlang.ru
    Base as_base = d;//*cast(Base*)(&d);
   as_base.test();
тоже сегфолт
источник

МВ

Макс Воробьев... in dlang.ru
если убрать virtual destructor у  Base в С++ и поменять interface на abstract class в D, то все работает как надо
источник

МВ

Макс Воробьев... in dlang.ru
Any interface that derives from a C++ interface is also a C++ interface. A C++ interface differs from a D interface in that:

   It cannot be the argument to destroy.
   References cannot be upcast to the enclosing class object, nor can they be downcast to a derived interface.
   The C++ calling convention is the default convention for its member functions, rather than the D calling convention.
   The first member of the vtbl[] is not the pointer to the Interface, but the first virtual function pointer.
источник

МВ

Макс Воробьев... in dlang.ru
ну и нахуа такие интерфейсы?....
источник

OB

Oleg B in dlang.ru
вообще у классов С++ и D и D-шных интерфейсов разные способы размещения vtbl
источник

OB

Oleg B in dlang.ru
нахуя? хз
источник

OB

Oleg B in dlang.ru
и вроде был какой-то прикол с кастами интерфейсов даже чисто D-шных
источник

OB

Oleg B in dlang.ru
вообще upcast это костыль слегка
источник

МВ

Макс Воробьев... in dlang.ru
пойду писать на сишке....
источник

МВ

Макс Воробьев... in dlang.ru
и кидать структуры с  поинтерами на ф-и
источник

МВ

Макс Воробьев... in dlang.ru
нафиг нужен такой extern (C++) интерфейс, если к нему нельзя кастить и его нельзя передать в С++
источник

OB

Oleg B in dlang.ru
кажется вроде если через void* провернуть касты
источник