2017-09-25 2 views
2

cppreference.comThe default constructor is defaulted입니다. 또한 C++14 draft을 확인했는데 선언을 제외하고 기본 생성자에 아무 것도 말하지 않았습니다. constexpr duration() = default;std :: chrono :: duration은 어떻게 생성됩니까?

다음 코드를 실행하면 놀랐습니다. 그래서 140737364037104, 140737078676496과 :

chrono::seconds s; 
cout << s.count() << endl; 

나는 그것을 실행할 때마다

, 프로그램은 어떤 임의의 숫자를 인쇄합니다.

s 잘 초기화되지 않은 것 같습니다. 그런 다음 std::chrono::duration에 대한 컴파일러 (GCC 4.8)의 구현을 확인했습니다. 이 클래스에는 int 클래스의 데이터 멤버 (즉, count)가 클래스 내 이니셜 라이저없이 있습니다. 생성자는 기본값으로 생성됩니다. 따라서 데이터 멤버는 실제로 초기화되지 않습니다. 이것이 프로그램이 항상 임의의 숫자를 인쇄하는 이유입니다.

  1. 이 올바른 행동인가요 :

    다음은 내 질문입니까? 아니면 컴파일러는 데이터 멤버에게 클래스 이니셜 라이저를 제공해야합니까?

  2. 이것이 올바른 행동 인 경우, std::chrono::duration에 대해 표준에서 기본값 : 0을 지정하지 않는 이유는 무엇입니까?
+3

무엇이 질문입니까? 이것은'int a;와 다르지 않습니다. 그 맥락에서 디폴트 초기화를 이해한다면, 당신은'duration' 상황을 이해할 것입니다. –

답변

1

기본 구성 기간은 최적화로 인해 초기화되지 않습니다. ISO C++ Discussion에 같은 질문에서 비센테 J. Botet Escriba을 인용

:

안녕하세요, 제 생각 엔 당신이 를 사용하지 않는하지만 하워드는 것이 무엇을 지불하지 않는 패턴을 따르는 것입니다 그것을 더 잘 설명하십시오.

표현이 기본값은 0으로 초기화 할 수 원하는 경우 단지

std::chrono::duration<MyInt> d; // MyInt default constructor initialize the value to zero.

그것은 확인 및 추가 리드 디자이너와 <chrono> 시간의 저자에 의해 설명되고 그렇게 하나를 제공 할 수 있습니다 유틸리티 (하워드 Hinnant)

+2

다음은 0 초기화를위한 또 다른 구문입니다 :'chrono :: seconds s {};' –

+0

말이 맞습니다. 감사! –

관련 문제