As per following example
struct Apple {
~Apple() {};
};
int main()
{
Apple a1;
Apple a2 = std::move(a1);
}
and example
struct Apple {
~Apple() = default;
};
int main()
{
Apple a1;
Apple a2 = std::move(a1);
}
with following transformation done by compiler
struct Apple
{
inline ~Apple() /* noexcept */ = default;
// inline constexpr Apple() noexcept = default;
// inline constexpr Apple(const Apple &) noexcept = default;
};
int main()
{
Apple a1;
Apple a2 = Apple(static_cast<const Apple &&>(std::move(a1)));
return 0;
}
compiler added static_cast<const Apple &&>
in
Apple a2 = Apple(static_cast<const Apple &&>(std::move(a1)));
if there was a user defined/declared destructor. It was not the case as per example
struct Apple {
};
int main()
{
Apple a1;
Apple a2 = std::move(a1);
}
where the transformed code snippet by compiler was
struct Apple
{
// inline constexpr Apple() noexcept = default;
// inline constexpr Apple(Apple &&) noexcept = default;
};
int main()
{
Apple a1;
Apple a2 = Apple(std::move(a1));
return 0;
}
if no destructor is defined/declared by user.
Why was it the case?
PS People tends to think that it was because with user declared/defined destructor, compiler will only implicitly generate copy constructor but not move constructor. That is correct. But even only with copy constructor and without move constructor, const Apple& is able to be bound to rvalue ref and static_cast<const Apple&&> is not necessary for the code to compile, correct?
Aucun commentaire:
Enregistrer un commentaire