Вы могли бы сделать это, если бы захотели достаточно плохо. Для этого ваш foo
закончится как по существу повторной реализацией std::move
.
struct T
{
T() = default;
~T() = default;
T(T&&) = default;
};
template<class T> struct my_remove_reference {typedef T type;};
template<class T> struct my_remove_reference<T&> {typedef T type;};
// The third part of a normal `remove_reference`, but which we don't need in
// this case (though it'll all still be fine if you un-comment this).
//template<class T> struct my_remove_reference<T&&> {typedef T type;};
template <typename T>
typename my_remove_reference<T>::type &&foo(T &&t) {
return static_cast<typename my_remove_reference<T>::type &&>(t);
}
int main()
{
T t1;
T t2 = foo(t1);
return 0;
}
Теперь, несмотря на то, что вы можете/могли бы сделать это, другие ответы остаются более или менее правильно - даже если вы может сделать это, вы почти наверняка не должны. Если вы использовали этот foo
в реальном классе, который поддерживает перемещение (т. Е. Будет действительно перемещать состояние от источника до места назначения), вы в конечном итоге уничтожаете исходный объект, хотя он остается видимым.
Выполнение этого с вашим отредактированным вопросом, где foo
может, но не всегда, уничтожить исходный объект будет частности pernicious. При правильном имени, которое дает понять, что foo
действительно перемещается из источника, может, возможно, просто разумно это сделать - но (по крайней мере, для меня) функция, которая может или не может уничтожить ее аргумент значительно хуже, чем тот, который делает это надежно. Очевидно, что версия foo
, как и выше, что просто делает то же, что и std::move
, бессмысленно, но версия, которая также выполняла некоторую другую обработку на входе (и по какой-либо причине не могла использоваться вместе с std::move
) , возможно, будет едва приемлемым, если у вас действительно нет другого выбора.
Если вам нужно переместить-построить 't2' из' t1', почему бы вам не сделать 'T t2 {std :: move (t1)}'? –
Какова цель 'foo'? – GManNickG
См. Обновление для более конкретного примера – 3XX0