Сообщение Re: Тема деструкторы от 06.04.2026 6:41
Изменено 06.04.2026 7:14 rg45
Re: Тема деструкторы
Здравствуйте, LaptevVV, Вы писали:
LVV>Читаю тут драфт № 4849 от 2020-01-14
LVV>Пункт 11.4.6
LVV>И с удивлением вижу Destructors
LVV>Пункт 4 там:
LVV>
LVV>А как ?
Тут идёт речь о деструкторах, объявленных в шаблонах классов. Их действительно может быть несколько но(!) они должны быть объявлены с разными констрейнтами (секции requires) так, чтоб для каждого конкретного воплощения шаблона класса эти констрейнты оставляли только один экземпляр деструктора. Констрейны не обязательно должны быть взаимоисключающими (как при использовании SFINAE), они могут быть уточняющими. Т.е. это случай, когда один деструктор создаёт лучшее соответсвие типа, чем другой. Например:
LVV>Читаю тут драфт № 4849 от 2020-01-14
LVV>Пункт 11.4.6
LVV>И с удивлением вижу Destructors
LVV>Пункт 4 там:
LVV>
LVV>Их теперь может быть несколько ?At the end of the definition of a class, overload resolution is performed among the prospective destructors
LVV>declared in that class with an empty argument list to select the destructor for the class, also known as the
LVV>selected destructor.
LVV>А как ?
Тут идёт речь о деструкторах, объявленных в шаблонах классов. Их действительно может быть несколько но(!) они должны быть объявлены с разными констрейнтами (секции requires) так, чтоб для каждого конкретного воплощения шаблона класса эти констрейнты оставляли только один экземпляр деструктора. Констрейны не обязательно должны быть взаимоисключающими (как при использовании SFINAE), они могут быть уточняющими. Т.е. это случай, когда один деструктор создаёт лучшее соответсвие типа, чем другой. Например:
template<typename T>
class my_ptr
{
T* m_p{};
public:
~my_ptr() requires std::is_array_v<T> { delete[] m_p; }
~my_ptr() { delete m_p; }
};Re: Тема деструкторы
Здравствуйте, LaptevVV, Вы писали:
LVV>Читаю тут драфт № 4849 от 2020-01-14
LVV>Пункт 11.4.6
LVV>И с удивлением вижу Destructors
LVV>Пункт 4 там:
LVV>
LVV>А как ?
Тут идёт речь о деструкторах, объявленных в шаблонах классов. Их действительно может быть несколько но(!) они должны быть объявлены с разными констрейнтами (секции requires) так, чтоб для каждого конкретного воплощения шаблона класса эти констрейнты оставляли только один экземпляр деструктора. Констрейны не обязательно должны быть взаимоисключающими (как при использовании SFINAE), они могут быть уточняющими. Т.е. это случай, когда один деструктор создаёт лучшее соответсвие типа, чем другой. Например:
LVV>Читаю тут драфт № 4849 от 2020-01-14
LVV>Пункт 11.4.6
LVV>И с удивлением вижу Destructors
LVV>Пункт 4 там:
LVV>
LVV>Их теперь может быть несколько ?At the end of the definition of a class, overload resolution is performed among the prospective destructors
LVV>declared in that class with an empty argument list to select the destructor for the class, also known as the
LVV>selected destructor.
LVV>А как ?
Тут идёт речь о деструкторах, объявленных в шаблонах классов. Их действительно может быть несколько но(!) они должны быть объявлены с разными констрейнтами (секции requires) так, чтоб для каждого конкретного воплощения шаблона класса эти констрейнты оставляли только один экземпляр деструктора. Констрейны не обязательно должны быть взаимоисключающими (как при использовании SFINAE), они могут быть уточняющими. Т.е. это случай, когда один деструктор создаёт лучшее соответсвие типа, чем другой. Например:
template<typename T>
class my_ptr
{
std::remove_extent_t<T>* m_p{};
public:
~my_ptr() requires std::is_array_v<T> { delete[] m_p; }
~my_ptr() { delete m_p; }
};