는 C ++ 20 크로노 유형 / 값의 차이 무엇 month{7}
과 months{7}
? 비슷한 이름이 두 개 있으면 헷갈 리지 않나요?
답변:
네, 모두가 혼동 할 수 month
및 months
우선이 라이브러리가 발생한 경우. 그러나이 라이브러리에는 이러한 혼동을 줄이기 위해 일관된 명명 규칙이 있습니다. 장점은 짧고 직관적 인 이름을 유지하면서 뚜렷한 의미 체계를 명확하게 분리한다는 것입니다.
months
모든 "미리 정의 된" chrono::duration
유형은 복수형입니다.
nanoseconds
microseconds
milliseconds
seconds
minutes
hours
days
weeks
months
years
그래서 months
A는 chrono::duration
유형 :
월 사용 = duration < 최소 20 비트의 부호있는 정수 유형 , ratio_divide <years :: period, ratio <12 >>>;
그리고 그것은 정확히 (1) / (12) 의 years
.
static_assert(12*months{1} == years{1});
다음과 같이 인쇄 할 수 있습니다.
cout << months{7} << '\n';
출력은 다음과 같습니다.
7[2629746]s
이것은 2,629,746s의 7 단위로 읽습니다. 2,629,746 초는 민사 달력에서 한 달의 평균 길이입니다. 다르게 설명 :
static_assert(months{1} == 2'629'746s);
(정확한 숫자는 바 베팅에서이기는 경우를 제외하고는 특별히 중요하지 않습니다)
month
month
반면에 (단수)입니다 하지chrono::duration
. 그것은이다 역법 지정 민사 달력에서 올해의 달. 또는:
static_assert(month{7} == July);
이것은 다음과 같은 날짜를 형성하는 데 사용할 수 있습니다.
auto independence_day = month{7}/4d/2020y;
의 대수 month
와는 months
서로 다른 의미를 반영합니다. 예를 들어 "July + July"는 의미가 없으므로 컴파일 타임 오류입니다.
auto x = month{7} + month{7};
~~~~~~~~ ^ ~~~~~~~~
error: invalid operands to binary expression ('std::chrono::month' and 'std::chrono::month')
그러나 이것은 완벽하게 의미가 있습니다.
auto constexpr x = month{7} + months{7};
static_assert(x == February);
이:
auto constexpr x = months{7} + months{7};
static_assert(x == months{14});
그러나 :
auto b = February == months{14};
~~~~~~~~ ^ ~~~~~~~~~~
error: invalid operands to binary expression ('const std::chrono::month' and 'std::chrono::months')
즉 month
및 months
뿐만 아니라입니다 같지 않음, 그들은도 비교할 수 없습니다. 과일 비유에 관심이 있다면 사과와 오렌지입니다. ;-)
사이에 유사한 관계가있다 day
하고 days
. 그리고 사이 year
와 years
.
복수이면
chrono::duration
.
그리고이 <chrono>
두 가지 의미 상 구별되지만 유사한 개념이 코드에서 서로 혼동되지 않도록하는 데 도움이되는 유형 안전성 만 있습니다.
12*x
당신이 (전에 바로 거기에 정의되지 않은 동작을 가지고 오버 플로우 months
생성자 실행). 그러나 값이 months
12의 배수 (양수 또는 음수)이면 예, 더하기 (또는 빼기)는 본질적으로 작동하지 않습니다. 당신은 July == July + years(x)
.
July == July + months(12*x)
x에 관계없이 사실이 보장 됩니까? x가 INT_MAX 인 경우에도?