Другой способ захвата rvalue (универсальная ссылка) заключается в следующем:
template< typename T>
T getRvalue( T&& temp)
{
auto lambda = [ rTemp = std::move( temp)]() mutable
{
return T( std::forward< T>( rTemp));
};
return lambda();
}
std::move()
позволяет захватывать объекты подвижного типа, которые не могут быть захвачены копией.mutable
очень важно здесь в лямбде, пока mutable
не используется, объекты, захваченные лямбдой, не могут быть изменены, и компиляция выдаст следующую ошибку,
cannot conver 'rTemp (type 'const T') to type 'std::remove_reference<T>::type&' {aka 'T&'}
return T( std::forward< T>( rTemp));
Теперь о первом вопросе, «Как я могу явно указать тип захваченной переменной для лямбды в C ++?» Так что указывать тип не обязательно, компиляция сделает это, см. Следующую ссылку,https://en.cppreference.com/w/cpp/language/lambdaВ нем говорится A capture with an initializer acts as if it declares and explicitly captures a variable declared with type auto, whose declarative region is the body of the lambda expression.
Проще говоря, это означает, что автоматическая переменная выводится в соответствии с инициализатором и не требует явного указания ее типа, например
int x = 1;
auto lambda = [ y = x + 2](){ std::cout<< "y = "<< y<< std::endl;};
Здесь y
будет выводиться как int
инициализатором x + 2
.