здесь код, на котором я тестировал.
https: // Godbolt.org/z/nhwmpw1q4
Код: Выделить всё
#include
#include
template
struct deleter {
constexpr void operator()(T* ptr) {
delete ptr;
}
};
struct foo {
std::string str;
constexpr foo() = default;
constexpr foo(std::string const& s) : str(s) {}
constexpr foo(std::string&& s) : str(std::move(s)) {}
};
struct bar {
foo* ptr;
constexpr bar() : ptr(nullptr) {}
constexpr bar(foo* p) : ptr(p) {}
constexpr ~bar() { deleter{}(ptr); }
};
constexpr int func() {
bar(new foo());
return 5;
}
int main() {
static_assert(func() == 5);
}
https://en.cppreference.com/w/cpp/langu ... destructor! Также необходимо удовлетворить все следующие условия, чтобы быть ContexPR-Suitable: < /p>
для каждого субобъекта типа класса или (возможно, многомерный) их массив, этот тип класса имеет деструктор ContexPR. (до C ++ 23)
. Класс не имеет никакого виртуального базового класса. < /p>
< /blockquote>
< /blockquote>
Теперь, когда std :: string < /code> является contexpr, я думал, что неявно определенный деструктор foo должен иметь деструктор концентрации. Тем не менее, компилятор MSVC говорит, что деструктор Foo не помечен как contexpr. На деструкторе MSVC внезапно становится довольным кодом. /> это ошибка в MSVC или я что -то упускаю из стандарта? < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... destructor
Мобильная версия