문제

C ++ 0x의 새로운 기능 중 일부에 대해 조금 궁금합니다. 특히 루프의 범위 기반 그리고 이니셜 라이저 목록. 두 기능 모두 올바르게 작동하려면 사용자 정의 클래스가 필요합니다.

나는 accross에왔다 이 게시물, 그리고 대답은 도움이되었지만 도움이되었습니다. 전적으로 정확한지 모르겠습니다 (아마도 완전히 오해 할 것입니다. 첫 번째 답변에 대한 세 번째 의견을 참조하십시오). 에 따르면 현재 사양 이니셜 라이저 목록의 경우 헤더는 하나의 유형을 정의합니다.

template<class E> class initializer_list {
public:
    initializer_list();

    size_t size() const; // number of elements
    const E* begin() const; // first element
    const E* end() const; // one past the last element
};

사양에서 이것을 볼 수 있습니다. ctrl + f '클래스 이니셜 라이저 _list'.

위해서는 = {1,2,3} 암시 적으로 주조된다 initializer_list 클래스, 컴파일러는 {} 그리고 initializer_list. 무엇이든받는 생성자가 없으므로, 내가 알 수있는 한 Initializer_List는 컴파일러가 실제로 생성하는 모든 것에 결합되는 래퍼입니다.

그것은 동일합니다 for( : ) 사용자 정의 유형이 작동 해야하는 루프 (사양에 따라 배열 및 이니셜 라이저 목록에 대한 코드가 필요하지 않도록 업데이트되었지만 이니셜 라이저 목록에는 필요합니다. <initializer_list>, 따라서 프록시의 사용자 정의 코드 요구 사항입니다).

이것이 어떻게 작동하는지 완전히 오해하고 있습니까? 이러한 새로운 기능이 사용자 코드에 크게 의존한다고 생각하는 것은 잘못이 아닙니다. 마치 기능이 반 구워진 것처럼 느껴지고 컴파일러에 전체 기능을 구축하는 대신 컴파일러에 의해 반쯤 다르고 절반은 포함됩니다. 그 이유는 무엇입니까?

편집하다: '컴파일러 코드에 크게 의존하고' '사용자 코드에 크게 의존하지 않습니다'를 입력했습니다. 나는 내 질문을 완전히 버렸다고 생각합니다. 내 혼란은 컴파일러에 새로운 기능이 내장되는 것이 아니라 사용자 코드에 의존하는 컴파일러에 내장 된 것들입니다.

도움이 되었습니까?

해결책

이 새로운 기능이 컴파일러 코드에 매우 크게 의존한다고 생각하는 것은 잘못이 아닙니다.

그들은 컴파일러에 매우 의존합니다. 헤더를 포함 해야하는지 여부에 관계없이 사실 두 경우 모두 구문은 오늘날 컴파일러의 구문 분석 오류가 될 것입니다. 그만큼 for (:) 유일하게 허용 된 구조물이 for(;;)

마치 기능이 반 구워진 것처럼 느껴지고 컴파일러에 전체 기능을 구축하는 대신 컴파일러에 의해 반쯤 다르고 절반은 포함됩니다. 그 이유는 무엇입니까?

지원은 컴파일러에서 구현되어야하지만 시스템 헤더를 포함해야합니다. 이는 초기화 목록의 경우 몇 가지 목적으로 사용될 수 있습니다. 초기화 목록의 경우, 유형 (컴파일러 지원의 인터페이스)을 사용자의 범위로 가져와서 사용하는 방법 (VA_ARG가 C에있는 방법을 생각할 수 있음)을 제공 할 수 있습니다. 범위 기반 (구문 설탕)의 경우 컴파일러가 마법을 수행 할 수 있도록 범위를 범위로 가져와야합니다. 표준은 정의합니다 for ( for-range-declaration : expression ) statement (드래프트의 [6.5.4]/1)와 동일합니다.

{ 
   auto && __range = ( expression ); 
   for ( auto __begin = std::Range<_RangeT>::begin(__range), 
         __end = std::Range<_RangeT>::end(__range); 
         __begin != __end; 
         ++__begin ) { 
      for-range-declaration = *__begin; 
      statement 
   } 
} 

배열 및 STL 컨테이너에서만 사용하려는 경우 Range 개념 (C ++ 0X Sense는 아님)이지만 구문을 사용자 정의 클래스 (자체 컨테이너)로 확장하려면 컴파일러가 기존에 쉽게 의존 할 수 있습니다. Range 템플릿 (자신의 가능한 전문 분야와 함께). 정의되는 템플릿에 의존하는 메커니즘은 컨테이너에 정적 인터페이스를 요구하는 것과 같습니다.

대부분의 다른 언어는 일반 인터페이스 (컨테이너, ...)를 요구하고 런타임 다형성을 사용하는 방향으로 진행되었습니다. 그것이 C ++에서 수행된다면, STL 컨테이너가 공통베이스 나 인터페이스를 공유하지 않으므로 전체 STL은 주요 리팩토링을 거쳐야하며, 다리기 적으로 사용될 준비가되어 있지 않기 때문입니다.

현재 표준은 그렇지 않습니다 덤불 그것이 나올 때까지.

다른 팁

단지 구문 설탕입니다. 컴파일러는 주어진 구문 구성을 표준 유형 / 기호 이름을 직접 참조하는 동등한 C ++ 표현식으로 확장합니다.

이것은 최신 C ++ 컴파일러가 언어와 "외부 세계"사이에있는 유일한 강력한 커플 링이 아닙니다. 예를 들어, extern "C" C의 링크 모델을 수용하기위한 약간의 언어 해킹입니다. 스레드-로컬 스토리지를 선언하는 언어 지향적 인 방법은 암시 적으로 많은 RTL 해커에 의존합니다.

또는 C를보십시오. ...? 표준 라이브러리에 의존해야합니다. 그러나 그것은 C 컴파일러가 스택 프레임을 정확히 배제하는 방법에 대해 매우 어려운 마법을 사용합니다.

업데이트:

C ++가 여기에서 취한 접근 방식은 대안보다 C ++의 정신에 더 적합합니다. 본질적 수집 또는 범위 유형, 언어로 구운 것. 대신 공급 업체 정의 범위 유형을 통해 수행됩니다. 나는 벤더 정의 된 액세서 매크로가 없으면 비슷한 쓸모없는 Variadic 인수와는 크게 다르지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top