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 접근에 유용해요.

더 알아보기 (Learn more)

cppreference