Size: a a a

2020 October 24

AF

Aidar Fattakhov in pro.cxx
а invoke это достать результат
источник

АК

Артём Колпаков... in pro.cxx
Aidar Fattakhov
а invoke это достать результат
Что вы имеете в виду, если вызывается void(*)(...)?
источник

AF

Aidar Fattakhov in pro.cxx
я бы юзал и то и то
источник

AF

Aidar Fattakhov in pro.cxx
у члена void (Foo::*bar)(); я бы юзал invoke
для описания () у сущности-без-метатипа foo->*bar я бы юзал call
источник

АК

Артём Колпаков... in pro.cxx
Просто к чему это всё. Я пытаюсь понять, можно ли дважды вызвать деструктор trivially destructible типов, ведь рассматривая сгенерированный код https://godbolt.org/z/bTMEGY даже без оптимизаций не генерируются какие-либо действия, хотя в стандарте я упоминания этого найти не могу (что для trivial destructor не генерируется код).
Стандарт ясно говорит http://eel.is/c++draft/class.dtor#19, но вкладывая мой смысл, для trivial, хотя может быть call ~T(), вызова (invoke) просто нет.
Можете что-либо сказать по этому поводу?
источник

VS

Vlad Serebrennikov in pro.cxx
Артём Колпаков
Просто к чему это всё. Я пытаюсь понять, можно ли дважды вызвать деструктор trivially destructible типов, ведь рассматривая сгенерированный код https://godbolt.org/z/bTMEGY даже без оптимизаций не генерируются какие-либо действия, хотя в стандарте я упоминания этого найти не могу (что для trivial destructor не генерируется код).
Стандарт ясно говорит http://eel.is/c++draft/class.dtor#19, но вкладывая мой смысл, для trivial, хотя может быть call ~T(), вызова (invoke) просто нет.
Можете что-либо сказать по этому поводу?
стандарт описывает свойства и поведение объектов, время жизни которых началось и не закончилось (basic.life#4), поэтому если вы вызвали деструктор дважды и оно не сломалось, то вам просто везет
источник

АК

Артём Колпаков... in pro.cxx
Vlad Serebrennikov
стандарт описывает свойства и поведение объектов, время жизни которых началось и не закончилось (basic.life#4), поэтому если вы вызвали деструктор дважды и оно не сломалось, то вам просто везет
В этом же самом пункте указывается, вне времени жизни есть существенные ограничения, часть которых описана тут http://eel.is/c++draft/class.cdtor
Первый пункт утверждает, For an object with a non-trivial destructor, referring to any non-static member or base class of the object after the destructor finishes execution results in undefined behavior
источник

АК

Артём Колпаков... in pro.cxx
Но что насчет trivial destructible?
источник

АК

Артём Колпаков... in pro.cxx
А также, что относительно pseudo destructor?
источник

VS

Vlad Serebrennikov in pro.cxx
Артём Колпаков
А также, что относительно pseudo destructor?
это для шаблонного кода, чтобы можно было вызывать деструктор и не париться насчет того, что у фундаментальных типов его нет
источник

VS

Vlad Serebrennikov in pro.cxx
Артём Колпаков
В этом же самом пункте указывается, вне времени жизни есть существенные ограничения, часть которых описана тут http://eel.is/c++draft/class.cdtor
Первый пункт утверждает, For an object with a non-trivial destructor, referring to any non-static member or base class of the object after the destructor finishes execution results in undefined behavior
это никак не противоречит тому, что я сказал
источник

VS

Vlad Serebrennikov in pro.cxx
первый раз деструктор вызывается у объекта, второй — на байты storage, которые от него остались
источник

VS

Vlad Serebrennikov in pro.cxx
если вы сможете доказать, что тривиальные деструкторы можно вызывать на случайные участки памяти, то тогда сможете вызывать их столько раз, сколько пожелаете
источник

АК

Артём Колпаков... in pro.cxx
В дополнение, вот этот пункт http://eel.is/c++draft/basic.memobj#basic.life-9 так же косвенно сообщает, что повторный вызов деструктора тривиально удаляемого типа допустим
источник

VS

Vlad Serebrennikov in pro.cxx
Артём Колпаков
Но что насчет trivial destructible?
http://eel.is/c++draft/class.dtor#8
оно вот. явно там не написано, что код выполнять не нужно, но идея тривиальности именно в этом
источник

VS

Vlad Serebrennikov in pro.cxx
Артём Колпаков
В дополнение, вот этот пункт http://eel.is/c++draft/basic.memobj#basic.life-9 так же косвенно сообщает, что повторный вызов деструктора тривиально удаляемого типа допустим
я бы не стал так расширительно толковать текст стандарта. там лишь явно указан случай неопределенного поведения
источник

VS

Vlad Serebrennikov in pro.cxx
еще есть basic.life#7, который как раз про glvalue после первого вызова деструктора
источник

VS

Vlad Serebrennikov in pro.cxx
using the properties of the glvalue that do not depend on its value is well-defined
интуитивно я могу предположить, что тривиальный деструктор не полагается на значение, но затрудняюсь обосновать как эту точку зрения, так и противоположную
источник

VS

Vlad Serebrennikov in pro.cxx
но в свете class.dtor#19 это все вилами по воде писано, конечно
источник

DS

Dmitry Sokolov in pro.cxx
Vlad Serebrennikov
http://eel.is/c++draft/class.dtor#8
оно вот. явно там не написано, что код выполнять не нужно, но идея тривиальности именно в этом
Там же написано
Once a destructor is invoked for an object, the object's lifetime ends; the behavior is undefined if the destructor is invoked for an object whose lifetime has ended ([basic.life]).
А если оно UB, есть вероятность что вторичный вызов может быть распознан компилятором как UB, а значит он такую ветку может например посчитать вообще unreachable.
источник