Код: Выделить всё
#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 & смогу, по крайней мере, смягчить временный экземпляр, и он успешно составлен на MSVC. Решение, потому что это не приводит к повышению поступления, а скорее в подтверждении копирования ...
Подробнее здесь: https://stackoverflow.com/questions/796 ... struct-c23
Мобильная версия