Я хочу, чтобы закодировать несколько рекурсивно взаимодействующим объединить функции, которые я думаю, должен иметь подписи: T&& merge_XYZ(T&& a, T&& b);
Создать временный перейти к ссылке RValue
Они, как правило, используются рекурсивно с линиями, такие как:
return merge_XYZ(std::move(x), std::move(y));
Каждая из этих нескольких функций слияния украдет содержимое одного из входов и введет их в другой вход и вернет результат. Как правило, они будут иметь x
и y
, которые являются именами для ссылок на rvalue и поэтому должны быть возвращены обратно к rvalue-ссылкам на std::move
(исправьте меня, если я ошибаюсь).
Но редко они имеют x
и или y
, которые являются ссылками на объекты, содержимое которых не должно быть украдено. Я определенно не хочу писать альтернативные не ворующие версии этих функций. Скорее, я хочу, чтобы вызывающий абонент справился с этим в этих редких случаях. Так что мой главный вопрос правильный способ сделать это состоит в том, чтобы явно ссылаться на строительство копии, такие как:
T temp = merge_QRS(T(x), T(y)); // use x and y without stealing yet
return merge_XYZ(merge_MNO(std::move(x), std::move(y)), std::move(temp));
Главный вопрос: Является ли T(x)
правильный путь, чтобы заставить временную копию, который будет создан в этой точке?
Другие вопросы:
Is T temp =
правильный способ убедиться, что вызов merge_QRS
в приведенном выше коде происходит перед вызовом merge_MNO
, но в противном случае недорог вперед временный от в первый операнд merge_XYZ
? Если я использовал T&& temp
, то вместо этого он удерживал указатель на измененный T(x)
после жизни T(x)
?
Есть ли T&&
правильный тип возврата (в отличие от T
) для объединения многих из них вместе?
Как выше по сравнению с:
T tx = x;
T&& temp = merge_QRS(std::move(tx), T(y)); // use x and y without stealing yet
return merge_XYZ(merge_MNO(std::move(x), std::move(y)), std::move(temp));
Предполагая, что merge_QRS
будет модифицировать ТХ и возвращающий ссылку RValue в том, что поведение всех определенных?
Запись на этот вопрос, возможно, помог мне понять, что я мог бы быть смешением двух ситуаций, которые не должны быть смешаны: Object вы не хотите, чтобы украсть против объектов, которые вы не хотите, чтобы украсть у еще. Является ли мой оригинал merge_QRS(T(y), T(x))
прав (только если он используется в одном выражении) для объектов, из которых я не хочу воровать? Но в случае, если я пытался в качестве примера я должен иметь следующее:
T tx = x; // Make copies which can be stolen from
T ty = y;
return merge_XYZ(merge_MNO(std::move(x), std::move(y)),
merge_QRS(std::move(tx), std::move(ty)));
Я думаю, что все еще может быть смущен о краже содержимого против кражи личности. Если я вернусь на T&&
, я украл личность одного входа в дополнение к краже содержимого другого. Когда мне удастся украсть личность? Если я вернусь на T
, я никогда не украду личность, а иногда не смогу украсть личность неэффективно.
Если вы не хотите, чтобы объект был «украден из» при передаче в качестве параметра либо не передавал его в качестве параметра, либо полагался на то, что lvalues не привязываются к rvalue-ссылкам ([пример] (http : //coliru.stacked-crooked.com/a/e05851d887896a53)) –
@MarcoA. Мне не нужна ошибка времени компиляции. Я хочу правильно работать с кодом. (На самом деле, мне нужна ошибка времени компиляции, когда я неправильно передаю объект функции кражи. Я думаю, что мой дизайн охватывает это. Но я хочу, чтобы был правильный способ передать их, что означает способ сделать копию с целью иметь копия украдена из). – JSF
Как насчет определения 'T && merge_XYZ (T a, T b)'? Будет ли это работать? Без move() это создало бы temp, и с move() он вызывал && версию. – Arkadiy