chrono :: month와 chrono :: months의 차이점은 무엇입니까?


106

는 C ++ 20 크로노 유형 / 값의 차이 무엇 month{7}months{7}? 비슷한 이름이 두 개 있으면 헷갈 리지 않나요?

답변:


130

네, 모두가 혼동 할 수 monthmonths우선이 라이브러리가 발생한 경우. 그러나이 라이브러리에는 이러한 혼동을 줄이기 위해 일관된 명명 규칙이 있습니다. 장점은 짧고 직관적 인 이름을 유지하면서 뚜렷한 의미 체계를 명확하게 분리한다는 것입니다.

months

모든 "미리 정의 된" chrono::duration유형은 복수형입니다.

  • nanoseconds
  • microseconds
  • milliseconds
  • seconds
  • minutes
  • hours
  • days
  • weeks
  • months
  • years

그래서 monthsA는 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')

monthmonths뿐만 아니라입니다 같지 않음, 그들은도 비교할 수 없습니다. 과일 비유에 관심이 있다면 사과와 오렌지입니다. ;-)

사이에 유사한 관계가있다 day하고 days. 그리고 사이 yearyears.


복수이면 chrono::duration.


그리고이 <chrono>두 가지 의미 상 구별되지만 유사한 개념이 코드에서 서로 혼동되지 않도록하는 데 도움이되는 유형 안전성 만 있습니다.


July == July + months(12*x)x에 관계없이 사실이 보장 됩니까? x가 INT_MAX 인 경우에도?
PiotrNycz

3
거의. 만약 12*x당신이 (전에 바로 거기에 정의되지 않은 동작을 가지고 오버 플로우 months생성자 실행). 그러나 값이 months12의 배수 (양수 또는 음수)이면 예, 더하기 (또는 빼기)는 본질적으로 작동하지 않습니다. 당신은 July == July + years(x).
Howard Hinnant

17:58 질문에 17:58에 답변 하셨나요?
dejoma

2
그것은 명시 적으로 권장, 자신의 질문에 대답뿐만 아니라 괜찮아요 : stackoverflow.blog/2011/07/01/...를 , stackoverflow.com/help/self-answer
하워드 Hinnant
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.