std::dynamic_extent
std::dynamic_extent (동적 범위 상수)
std::span 등에서 "정적으로 알려지지 않은" 동적 범위를 나타내는 상수예요. std::size_t 타입의 값으로, 일반적으로 어떤 타입이 값을 정적으로가 아니라 동적으로 저장할 것임을 나타내요. C++20부터 있어요.
출처: cppreference
본문
<span> 헤더에 정의돼 있어요.
inline constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
std::dynamic_extent는 std::size_t 타입의 상수로, std::dynamic_extent를 사용하는 어떤 타입이 그 값을(예: 크기) 정적으로 타입 안에 알려두지 않고 동적으로 저장할 것임을 나타내는 데 일반적으로 쓰여요.
여러 문맥에서 사용돼요.
- 정적 범위와 동적 범위의
std::span을 구분. std::extents에서 특정 rank 인덱스의 범위(extent)가 동적으로 저장될 것임을 표시 (C++23).std::mdspan의 패딩 레이아웃이 패딩 값을 동적으로 저장할 것임을 표시 (C++26).
참고
std::size_t는 부호 없는 타입이므로, 동등한 정의는 다음과 같아요.
inline constexpr std::size_t dynamic_extent = -1;
(정수 변환 규칙 참조 — -1이 부호 없는 타입으로 변환되면 std::numeric_limits<std::size_t>::max()가 돼요.)
예제를 보면요.
#include <array>
#include <cassert>
#include <cstddef>
#include <span>
int main()
{
int a[3]{1, 2, 3};
std::span<int, 3> s3{a}; // 정적 범위 3
std::span<int> s{a}; // dynamic_extent, 동적 범위
assert(s3.extent == 3);
assert(s.extent == std::dynamic_extent);
assert(s.size() == 3); // 동적이라도 size()로 알 수 있어요
}
이렇게 정적 범위 std::span(타입에 크기 인코딩)과 동적 범위 std::span(실행 시 크기)을 구분하는 기준이 돼요.