Вот код, который я тестировал.
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
https://en.cppreference.com/w/cpp/langu ... destructor
Помимо требований функций constexpr, деструктор также должен удовлетворять всем следующим условиям, чтобы быть пригодным для constexpr:
Для каждого подобъекта типа класса или (возможно, многомерного) его массива, который тип класса имеет деструктор constexpr. (до C++23)
У этого класса нет виртуального базового класса.
Теперь, когда std::string является constexpr, я подумал, что неявно определенный деструктор foo должен иметь деструктор constexpr. Однако компилятор MSVC сообщает, что деструктор foo не помечен как constexpr.
И когда я добавил еще одну панель, которая использует delete в деструкторе, MSVC внезапно стал доволен кодом.
https://godbolt.org/z/7Mz8G8rro
Это ошибка в MSVC или я что-то упустил из стандарт?
Подробнее здесь: https://stackoverflow.com/questions/794 ... destructor
Мобильная версия