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