Смотрите пример ниже возвращение факультативного из UserName
- подвижный/копируемого класса.
std::optional<UserName> CreateUser()
{
UserName u;
return {u}; // this one will cause a copy of UserName
return u; // this one moves UserName
}
int main()
{
auto d = CreateUser();
}
Почему return {u}
вызывает копию и return u
перемещение?
Здесь соответствующий образец coliru: http://coliru.stacked-crooked.com/a/6bf853750b38d110
Другой случай (спасибо комментарию от @Slava):
std::unique_ptr<int> foo()
{
std::unique_ptr<int> p;
return {p}; // uses copy of unique_ptr and so it breaks...
}