forward_like — std::forward_like
forward_like — std::forward_like
std::forward_like는 T&&와 비슷한 특성을 가진 x에 대한 참조를 반환하는 함수예요. C++23에서 도입됐어요. <utility> 헤더에 있어요.
어떤 객체를 "참조 타입인 것처럼" 완전 전달(perfect forwarding)할 때 x의 값 종류(value category)를 T에 맞춰요.
출처: cppreference
본문
// <utility> 헤더, C++23
template< class T, class U >
constexpr auto&& forward_like( U&& x ) noexcept;
반환 타입은 다음과 같이 결정돼요.
T가 lvalue 참조이면 →x도 lvalue로T가 rvalue(또는 값)이면 →x도 rvalue로 형변환된 참조로
즉 forward_like<T>(x)은 T&&의 값 종류를 x에 적용한 참조예요.
사용 예 — 프로퍼티 접근자에 적용
#include <utility>
#include <type_traits>
struct Wrapper {
std::vector<int> data;
// 멤버 접근 시 *this의 값 종류를 따라 data를 전달
decltype(auto) get() & { return data; } // lvalue
decltype(auto) get() && { return std::move(data); } // rvalue
};
forward_like는 클래스 멤버 접근에서 "객체가 lvalue인지 rvalue인지에 따라 멤버를 그대로 전달"하고 싶을 때 유용해요.
// *this가 rvalue면 data도 이동
template<class Self>
decltype(auto) data_of(this Self&& self) {
// self는 forwarding reference — self.data의 값 종류를 self에 맞춤
return std::forward_like<Self>(self.data);
}
특징
- 제네릭 코드에서 "어느 값 종류인지 따라 멤버/인자를 완전 전달"을 간결하게 표현.
std::forward보다 폭넓게 — 전달하려는 대상의 값 종류를 "별도 타입 인자"로 지정.constexpr,noexcept.
std::forward_like는 멤버 접근·this 기반 전달 등에서 값을 lvalue/rvalue로 정확히 포워딩하는 C++23 도구예요.