Если в классе есть деструктор, объявленный с необходимым пунктом, который оценивается на ложь, почему класс не тривиально разрушаем? class = "lang-cpp prettyprint-override">
Код: Выделить всё
#include
template
class Optional
{
public:
~Optional() requires (!std::is_trivially_destructible_v);
};
#include
int main()
{
const char* bool_value[] = {"false", "true"};
bool is_trivial = std::is_trivial_v;
bool is_trivial_destructable = std::is_trivially_destructible_v;
std::printf("std::is_trivial_v = %s\n", bool_value[is_trivial]);
std::printf("std::is_trivial_destructable = %s\n", bool_value[is_trivial_destructable]);
}
Почему ~ optainal () требует (false) сделать класс необязательным нетривиальным? class = "lang-cpp prettyprint-override">
Код: Выделить всё
~Optional() requires (!std::is_trivially_destructible_v);
~Optional() = default;
Предполагая, что шаблон создается экземпляром, а ограничение требуется , что означает, что будет 2 предполагаемых деструктора, правильные? Согласно стандарту C ++ в [class.dtor] < /code>: < /p>
В конце определения класса разрешение перегрузки выполняется среди проспективных деструкторов, объявленных в этом классе с пустым списком аргументов, чтобы выбрать Destructor для Class>, также известный как отбор Destructor. не удас.
Код: Выделить всё
[basic.def.odr]
Код: Выделить всё
[dcl.fct.def.delete]
Итак, мой вопрос: как разрешение перегрузки решает, какой проспективный деструктор становится выбранным деструктором, если есть несколько из них? /> < /li>
Проспективные деструкторы в c ++ < /p>
< /li>
< /ul>
Но они не отвечают на мой вопрос. Принятый ответ на 1 -й гласит: < /p>
какое объявление деструктора выживает, определяется позже, согласно части указанного вами стандарта. Решение для перегрузки требует замены шаблонов на все «будущие деструкторы». Это вызывает любые такие деструкторы, чьи требуют положения не исчезнут. Если этот процесс решается до одного деструктора, то это фактический деструктор. и если он разрешается несколькими деструкторами, то код плохо образуется. Или разрешение перегрузки считает, что одно «лучше», чем другое? Я что -то упускаю?
Подробнее здесь: https://stackoverflow.com/questions/797 ... estructors