пределами времени жизни это УБ, в то же время жизнь заканчивается с начала вызова деструктора, и в то же время где то написано было что member functions можно вызывать во время деструкции. Как правильно?
Где это было написано? То, что это уб, правильно
cppreference плохо стандарт пересказали тут
Member functions, including virtual functions (10.3), can be called during construction or destruction (12.6.2).
https://eel.is/c++draft/basic.life#6 > Before the lifetime of an object has started but .... > For an object under construction or destruction, see [class.cdtor]. https://eel.is/c++draft/class.cdtor#4 > Member functions, including virtual functions ([class.virtual]), can be called during construction or destruction ([class.base.init]).
https://stackoverflow.com/questions/37960088/accessing-owner-in-destructor-c
да, так как все таки правильно?
Да, видимо не надо было доверять цппрефу и сразу открыть стандарт
Жизнь объекта заканчивается в момент начала деструктора, но в процессе работы деструктора некоторые операции всё ещё можно делать
Access outside of lifetime Before the lifetime of an object has started but after the storage which the object will occupy has been allocated or, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, the following uses of the glvalue expression that identifies that object are undefined: 1 Lvalue to rvalue conversion (e.g. function call to a function that takes a value). 2 Access to a non-static data member or a call to a non-static member function.
вот тут именно про outside of lifetime с cppreference
А часть про виртуальный функции не меняли? Насколько помню было что-то плохое с вызовом pure-virtual функций в конструкторе
Да, но [class.cdtor]/4 явным образом это дело частично разрешает
Нет, там плохо потому что в конструкторе мы "не видим" своего наследника и pure virtual ещё ни с кем не связана
То есть она в принципе не зовется и на этапе компиляции это ломается?
Увы, ломается в рантайме. Но наверняка будет предупреждение компилятора
Да и [class.cdtor]/3 явным образом разрешает, например, обращаться к полям: > ... To form a pointer to (or access the value of) a direct non-static member of an object obj, the construction of obj shall have started and its destruction shall not have completed, otherwise the computation of the pointer value (or accessing the member value) results in undefined behavior.
спасибо, видимо в сппреф неправильно стандарт описан
Поправил. Надеюсь, фигни не добавил.
Обсуждают сегодня