Может ли возвращение локальной переменной по значению в C ++ 11/14 привести к тому, что возвращаемое значение будет построено с помощью rvalue, когда нет копирования / перемещения?
Я знаю, что в следующей ситуации компилятор может свободно перемещать-конструировать возвращаемое значение изmakeA
(но он также может удалить копию или вообще переместить ее):
struct A
{
A(A&);
A(A&&);
};
A makeA()
{
A localA;
return localA;
}
Что мне интересно, так это то, что компилятору разрешено создавать объекты типаA
из локального объекта типаB
по ссылке rvalue, если она создается в операторе return. Другими словами, в следующем примере разрешено ли компилятору выбиратьA
конструктор 4 для возвращаемого значения?
struct B { };
struct A {
A(A&); // (1)
A(A&&); // (2)
A(B&); // (3)
A(B&&); // (4)
};
A makeA()
{
B localB;
return localB;
}
Я спрашиваю об этом, потому что мне кажется, что та же логика, которая позволяет локальный объект типаA
обработка в качестве значения r в выражении возврата также должна позволять рассматривать локальные объекты любого типа как значения r, но я не могу найти никаких примеров или вопросов такого рода.