user_literal — 사용자 정의 리터럴

user_literal — 사용자 정의 리터럴 (User-defined literals)

**사용자 정의 리터럴(user-defined literal)**은 정수·부동 소수점·문자·문자열 리터럴이 사용자 정의 타입의 객체를 만들어내게 하는 기능이에요. 사용자 정의 **접미사(suffix)**를 정의해서 사용해요. C++11에서 도입됐어요.

10_km, 3.5_s, "text"_tag  // 접미사로 사용자 정의 리터럴

출처: cppreference

본문

문법 (Syntax)

사용자 정의 리터럴은 다음 형태 중 하나예요 (C++11).

decimal-literal ud-suffix      // 정수
octal-literal ud-suffix
hex-literal ud-suffix
binary-literal ud-suffix       // C++14
fractional-constant exponent-part ud-suffix   // 부동 소수점
...

접미사(ud-suffix)는 별도로 선언된 리터럴 연산자(literal operator)에 대응돼요.

// 길이를 나타내는 사용자 정의 리터럴
constexpr long double operator""_km(long double x) {
    return x * 1000.0;
}
constexpr long double operator""_m(long double x) {
    return x;
}

// 사용
auto d = 5.0_km;   // 5000.0
auto m = 100.0_m;  // 100.0

리터럴 연산자의 형태는 접미사 종류에 따라 달라져요.

// 정수 리터럴용
constexpr unsigned operator""_u(unsigned long long v) { return v; }

// 문자열 리터럴용 (C++20부터 const char*는 삭제, char형 템플릿 권장)
std::string operator""_s(const char* s, std::size_t n) {
    return std::string(s, n);
}

주의할 점들:

  • 접미사는 밑줄 _로 시작해야 해요. 밑줄 없이 시작하는 접미사는 표준이 예약해요 (예: "s"std::literalsstring 리터럴).
  • 리터럴 연산자는 operator"" 문법으로 정의해요.
  • C++20부터 문자열 리터럴 연산자의 const char* 오버로드는 삭제되고, 문자 형식 템플릿(class-type)이나 _s처럼 (const char*, size) 형태를 써요.
  • 접미사는 오버로딩에 참여하므로 같은 접미사에 여러 타입 연산자를 둘 수 있어요.
// 단위 부호 있는 값
constexpr int operator""_h(int x) { return x * 3600; }
auto secs = 2_h;  // 7200

사용자 정의 리터럴은 단위(길이, 시간, 각도), 해시, 정규식 등을 타입 안전하고 읽기 쉽게 표현할 때 강력하게 활용돼요.

더 알아보기 (Learn more)

cppreference