«Выражение не оценивалось до константы» на неявно определенном деструкторе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, неявно определяемый эсминец - это contexpr , если он соответствует требованиям. /cpp/language/destructor#неявно определяется_destructor

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

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

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

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

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

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