utility_as_const

utility_as_const (std::as_const: const 참조 변환 유틸리티)

이 페이지는 C++17부터 사용할 수 있는 std::as_const 함수 템플릿에 대해 설명해요. std::as_const는 lvalue 참조를 받아서 동일한 객체에 대한 const 한정 참조를 돌려주는 간단한 유틸리티예요. 비const 객체를 const 객체처럼 다뤄야 할 때 const_cast를 직접 쓰지 않고도 안전하게 const 참조를 얻을 수 있어서 유용해요.

출처: cppreference

본문

<utility> 헤더에 정의되어 있어요. (1)은 C++17부터 제공되는 함수 템플릿이고, (2)는 rvalue 참조에 대한 오버로드를 삭제한 형태예요. 임시 객체나 rvalue를 as_const에 전달하면 컴파일 오류가 발생하도록 막아 주는 역할을 해요.

<utility> 헤더에 정의됨
template < class T > constexpr std :: add_const_t < T >& as_const ( T & t ) noexcept ; (1) (C++17부터)
template < class T > void as_const ( const T && ) = delete ; (2) (C++17부터)

가능한 구현 (Possible implementation)

template < class T > constexpr std :: add_const_t < T >& as_const ( T & t ) noexcept { return t ; }

참고 사항 (Notes)

std::as_const는 lvalue 참조에 const 한정자를 추가하는 것 외에는 아무 일도 하지 않아요. 반환된 참조는 원본 객체와 동일한 주소를 가리키며, 원본 객체가 비const여도 반환된 참조를 통해 수정하는 것은 불가능해요. rvalue에 대한 오버로드가 삭제되어 있으므로 임시 객체를 const 참조로 묶으려는 시도는 컴파일 타임에 차단돼요.

기능 테스트 매크로 표준 기능
__cpp_lib_as_const 201510L (C++17) std::as_const

예제 (Example)

다음 예제는 std::as_const를 사용해 비const 객체에 대한 const 참조를 얻는 방법을 보여줘요.

#include <cassert>
#include <string>
#include <type_traits>
#include <utility>

int main()
{
    std::string mutableString = "Hello World!";
    auto&& constRef = std::as_const(mutableString);

    mutableString.clear(); // OK
//  constRef.clear(); // Error: 'constRef' is 'const' qualified,
                      //        but 'clear' is not marked const

    assert(&constRef == &mutableString);
    assert(&std::as_const(mutableString) == &mutableString);

    using ExprType = std::remove_reference_t<decltype(std::as_const(mutableString))>;

    static_assert(std::is_same_v<std::remove_const_t<ExprType>, std::string>,
                  "ExprType should be some kind of string.");
    static_assert(!std::is_same_v<ExprType, std::string>,
                  "ExprType shouldn't be a mutable string.");
}

이 예제에서 constRefmutableString에 대한 const 참조이므로 clear()를 호출할 수 없어요. 하지만 mutableString 자체는 비const 객체이므로 clear()를 호출할 수 있어요. as_const가 반환하는 참조는 원본 객체와 항상 동일한 주소를 가리켜요. 또한 decltypestatic_assert를 통해 반환 타입이 const 한정된 문자열 타입임을 확인할 수 있어요.

같이 보기 (See also)

is_const (C++11) 타입이 const 한정자인지 검사해요 (클래스 템플릿) [편집]
is_const (C++26) 리플렉션이 const 타입 또는 const 한정자를 가진 함수 타입을 나타내는지 검사해요 (함수) [편집]
add_cv add_const add_volatile (C++11) (C++11) (C++11) 주어진 타입에 const 및/또는 volatile 한정자를 추가해요 (클래스 템플릿) [편집]
remove_cv remove_const remove_volatile (C++11) (C++11) (C++11) 주어진 타입에서 const 및/또는 volatile 한정자를 제거해요 (클래스 템플릿) [편집]
ranges::as_const_view views::as_const (C++23) 뷰를 constant_range로 변환해요 (클래스 템플릿) (범위 어댑터 객체) [편집]

더 알아보기 (Learn more)

cppreference