2009-07-29 3 views
11

() Preamble : 나는 C++ 0x 게임의 추종자이며 C++ 0x 표준의 개념 제거에 관한 최근의 논란은 저에게 동기를 부여했습니다. 개념에 대해 더 많은 것을 배우는 것에 관심이 있습니다. 특히, 개념이 유효한 C++ 코드가 될 수없는 한, 모든 질문이 완전히 가설적이라는 것을 이해합니다. 최근의 결정과 논쟁 뒤에있는 장점을 더 잘 이해하는 데 어떻게 도움이 될지)가상의 C++ 0x 개념 질문들

C++ 0x (최근까지) 개념에 대한 소개 자료를 읽은 후 문제가 발생했습니다. 내 마음을 구문 론적으로 둘러싼 다. 문제. 더 이상 신경 쓰지 않고 여기 내 질문이 있습니다 :

1) 내재적으로, auto 키워드를 통해 또는 concept_maps를 통해 명시 적으로 파생 개념을 지원하는 유형도 기본 개념을 독립적으로 지원해야합니까? 즉, 다른 개념 (예 : concept B<typename T> : A<T>)에서 개념을 유도하는 행위가 암시 적으로 '보이지 않는'요구 사항 (B 내 requires A<T>;)을 포함합니까? 클래스 상속에서와 마찬가지로

, 또한 기본 개념의 요구 사항을 충족 파생 개념의 요구 사항을 충족 유형 : 혼란은 상태 개념에 대한 위키 백과 페이지에서 발생한다. 유형은 반드시 나에게 아무 의미 기본 개념의 요구 사항을 파생 된 개념의 요구 사항을 충족해야하지 말 것

. 나는 Wikipedia가 결정적인 근원에서 멀리다는 것을 이해한다; 위의 설명은 단어의 잘못된 선택입니까?

2) 입력 이름을 나열하는 개념을 '자동'으로 지정할 수 있습니까? 그렇다면 컴파일러는 이러한 typename을 어떻게 자동으로 매핑합니까? 그렇지 않다면 컨셉에 '자동'을 사용하는 것이 무효가되는 다른 경우가 있습니까? 이러한 클래스 중 하나가 SomeType을 일치합니다

template<typename Type> 
class Dummy {}; 

class Dummy2 { public: typedef int Type; }; 

auto concept SomeType<typename T> 
{ 
    typename Type; 
} 

template<typename T> requires SomeType<T> 
void function(T t) 
{} 

int main() 
{ 
    function(Dummy<int>()); //would this match SomeType? 
    function(Dummy2()); //how about this? 
    return 0; 
} 

: 명확히하기 위해

다음 가상 코드를 살펴? 또는 typemames와 관련된 개념에 필요한 concept_map입니까?

3) 마지막으로, 어떤 공리를 정의 할 수 있는지 이해하는 데 어려움을 겪고 있습니다. 예를 들어, 나는 그런

concept SomeConcept<typename T> 
{ 
    T operator*(T&, int); 

    axiom Inconsistency(T a) 
    { 
     a * 1 == a * 2; 
    } 
} 

으로 그 무엇을 할 것, 개념은 논리적으로 일관성이 공리를 정의 할 수? 그것도 유효합니까?

매우 긴 질문이므로 감사드립니다.

답변

10

다음 답변에 대한 참조로 가장 최근의 C++ 0x 초안 N2914 (여전히 개념이 포함되어 있음)을 사용했습니다.

1) 개념은 인터페이스와 비슷합니다. 유형이 개념을 지원하는 경우 모든 "기본"개념도 지원해야합니다. 당신이 인용 한 Wikipedia 진술은 유형 클라이언트의 관점에서 이해할 수 있습니다. T이 개념 Derived<T>을 만족한다는 것을 알고 있다면 그는 또한 개념 Base<T>을 만족한다는 것을 알고 있습니다. 작성자 관점에서 볼 때 이는 자연스럽게 구현되어야 함을 의미합니다. 14.10.3/2 참조.

2) 예, typename 구성원의 개념은 auto 일 수 있습니다. 이러한 멤버는 동일한 개념의 함수 멤버 정의에 사용되는 경우 자동으로 추론 할 수 있습니다. 예를 들어, 반복자에 대한 value_typeoperator*의 반환 유형으로 추론 할 수 있습니다. 그러나 형식 멤버가 아무데도 사용되지 않으면 추론되지 않으므로 암시 적으로 정의되지 않습니다. 귀하의 예에서는 을 Dummy 또는 Dummy1으로 추론 할 방법이 없습니다. Type은 개념의 다른 구성원이 사용하지 않으므로 어느 클래스도 개념에 매핑되지 않습니다. 실제로 어떤 클래스도 자동 매핑 할 수 없습니다. 그것을). 14.10.1.2/11 및 14.10.2.2/4를 참조하십시오.

3) 공리는 스펙의 약점이었고, 몇 가지 (더) 의미를 갖기 위해 끊임없이 업데이트되었습니다. 드래프트에서 컨셉을 빼기 직전에, paper이 조금씩 바뀌 었습니다. 그것을 읽고 더 이해할 수 있는지, 또는 여전히 그것에 관해 질문이 있는지 확인하십시오.

예를 들어 구문상의 차이를 고려하면 컴파일러는 (a*1)(a*2)과 같다고 간주하여 해당 언어의 "있는 그대로의"규칙을 적용 할 수 있습니다. 컴파일러는 결과가 처럼 동작하는 한 원하는 최적화를 수행 할 수있었습니다.과 같지 않습니다. 그러나 컴파일러는 공리의 정확성을 검증하는 데 어떤 식 으로든 요구되지 않습니다 (따라서 공리라고하는 이유!).

+0

좋은 답변입니다. 당신은 내가 2)와 3)의 질문에 대한 의혹을 확인했고, 나는 그런 식으로 생각하지 않았습니다. 다시 한번 감사드립니다. – GRB