«выражение не получило константу» в неявно определенном деструктореC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 «выражение не получило константу» в неявно определенном деструкторе

Сообщение Anonymous »

У меня возникла ошибка в MSVC 19.43, а в gcc и clang — нет.

Вот код, который я тестировал.

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);
}
Согласно cppreference, неявно определенный разрушитель является constexpr, если он соответствует требованиям.

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»