MSVC вызов удаленного деструктора при упаковке rValue в структуру (C ++ 23)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 MSVC вызов удаленного деструктора при упаковке rValue в структуру (C ++ 23)

Сообщение Anonymous »

Я экспериментирую, с семантикой перемещения в тип обертки: < /p>

Код: Выделить всё

#include 
#include 

// Type that will get moved
struct NonDestructible {
~NonDestructible() = delete;
};
static_assert(::std::is_copy_assignable_v);
static_assert(::std::is_move_assignable_v);

// A sheddable wrapper that implicitly casts to an rvalue
template
struct Move {
T&& value;

Move(T& what) : value {::std::move(what)} {}
operator T&& () const noexcept { return ::std::forward(value); }
};

// CTAD for readability
template
Move(T&) -> Move;

int main() {
alignas(NonDestructible) char buffer1[sizeof(NonDestructible)] {};
alignas(NonDestructible) char buffer2[sizeof(NonDestructible)] {};
auto t1 = reinterpret_cast(buffer1);
auto t2 = reinterpret_cast(buffer2);
*t1 = ::std::move(*t2);
*t2 = Move(*t1); // ERROR on MSVC: attempts calling ~NonDestructible
return 0;
}
< /code>
Почему этот код не удается на MSVC (v19.latest), при этом скомпилируется на GCC (14.2) и Clang (19.1)? По какой-то причине пытается призвать деструктора, и, таким образом, терпит неудачу ...
вместе с этим, это также заставляет неявное задание провалиться, несмотря на то, что он проходит как подлежащее движению. < /P>
Кто неправ и кто прав? Компиляторы
 Редактировать #1 
После большого количества произведений я выяснил, что MSVC просто отказывается вызывать неявный оператор T && 
, и вместо этого всегда настаивает на вызове воображаемого оператора Const t & Code>. Что, возможно, приводит к созданию временного неразрушимого объекта, который впоследствии разрушается к концу операции по назначению движения.
Я решил вручную определить, что оператор const t & смогу, по крайней мере, смягчить временный экземпляр, и он успешно составлен на MSVC. Решение, потому что это не приводит к повышению поступления, а скорее в подтверждении копирования ...

Подробнее здесь: https://stackoverflow.com/questions/796 ... struct-c23
Ответить

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

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

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

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

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