Я думаю, что ваш вопрос сбит с толку тем, что вы говорите о «переводе» от вызываемого к вызывающему, и это не термин, который мы используем в C ++. Самый простой способ думать о возвращаемых значениях функции состоит в том, что вызываемый абонент общается с вызывающим абонентом через «слот возврата» (временный объект, созданный вызывающим объектом и уничтоженный вызывающим объектом). Вызывающий отвечает за построение возвращаемого значения в «обратном слоте», а вызывающий отвечает за извлечение значения из «обратного слота» (при желании), а затем уничтожает все, что остается в «возвращаемом слоте».
MyType MyFunction(SomeType const &x) noexcept
{
return SOME_EXPRESSION;
}
void MyCaller()
{
MyType test1 = MyFunction( RandomSomeType() ); // A
MyType test2{ MyFunction( RandomSomeType() ) }; // B
//...
test1 = MyFunction( RandomSomeType() ); // C
test2 = std::move( MyFunction(RandomSomeType()) ); // D
MyFunction( RandomSomeType() ); // E
}
Первый: оператор return SOME_EXPRESSION;
приводит к перемещению результата SOME_EXPRESSION
в "слот возврата" MyFunction
. Этот ход может быть elided . Если ход не исключен, будет вызван конструктор движения MyType
. Если этот конструктор перемещения выдает исключение, вы можете перехватить исключение через блок try вокруг самого return
или с помощью блока try function .
Кейс A
: Внутри MyFunction
(который может быть исключен) находится ход-ctor, а затем ctor-ход в test1
(который может быть исключен).
Дело B
: То же, что и дело A
.
Дело C
: Внутри MyFunction
(который может быть исключен) есть ход-ctor, а затем назначение перемещения в test1
.
Дело D
: То же, что и дело C
. Звонок на std::move
не приносит никакой пользы, и писать его нехорошо.
Дело E
: Внутри MyFunction
(который может быть исключен) есть ход-ctor, и все.
Если исключения генерируются во время перемещения-ctor или присваивания-перемещения в test1
, вы можете поймать их, поместив код, связанный с test1
, в блок try. Код внутри MyFunction
совершенно не имеет значения в этой точке; MyFunction
не знает или не заботится о том, что будет делать вызывающая сторона с возвращенным объектом. Только звонящий знает, и только звонящий может перехватывать исключения, сгенерированные звонящим.