as_const — std::as_const
as_const — std::as_const
std::as_const는 주어진 lvalue 참조를 const lvalue 참조로 캐스팅하는 함수예요. C++17에서 도입됐어요. <utility> 헤더에 있어요.
객체를 const로 취급해서, const 오버로드만 호출되도록 하는 데 사용해요.
출처: cppreference
본문
// <utility> 헤더, C++17
template< class T >
constexpr std::add_const_t<T>& as_const( T& t ) noexcept; // (1)
template< class T >
void as_const( const T&& ) = delete; // (2) rvalue 금지
- (1)
t를 const lvalue 참조로 취급해 반환. - (2) rvalue(임시)에 대해서는 삭제 — const 캐스팅 남용 방지.
사용 예
#include <utility>
#include <iostream>
struct C {
void f() { std::cout << "non-const\n"; }
void f() const { std::cout << "const\n"; }
};
C c;
c.f(); // non-const
std::as_const(c).f(); // const 버전 호출
as_const는 const 멤버 함수를 명시적으로 선택하고 싶을 때 유용해요. 또한 오버로드 해석에서 const 버전만 고려하게 해요.
// 범위 기반에서 const 접근을 강제
for (auto const& x : std::as_const(container)) {
// container가 const는 아니지만 const로 순회
}
특징
- 반환 타입은
const std::add_const_t<T>&— 즉 const 참조. - rvalue에 대해선 삭제되어, 임시 객체를 const로 만드는 것을 막아요.
- 매우 가볍고
constexpr·noexcept예요.
std::as_const는 한 객체를 const로 취급하고 싶을 때 명시적 캐스트 없이 의도를 드러내는 도우미예요. 특히 const 오버로드 선택·const-only 접근에 유용해요.