Может ли возвращение локальной переменной по значению в 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, но я не могу найти никаких примеров или вопросов такого рода.

Ответы на вопрос(1)

Ваш ответ на вопрос