일단 뭘 설명할지부터 나열하자면 n4849에 정의되있는 13.5.1.2 Atomic constraints, 13.5.3 Constraint normalization, 13.5.4 Partial ordering by constraints 세개에 대해서 설명할껀데, 사실 이것들만 설명하면 굳이 알아야될 이유도 모르겠고 머리에 잘 안들어올수 있으니 이것들이 어떤 문제를 해결하기위해 나왔는지부터 알아보자.


읽기전에 주의사항 : 디씨에서 대괄호가 짤리는거같으니까 ()로 대체해서씀. 헷갈릴수도있으니 주의하셈.



Concept이 있기전 클래스마다 다른 template specialization을 원하는데 일일히 하기엔 클래스들이 너무 많을때 entity들에 따라서 분리한뒤 SFINAE로 처리하면 보통 이런식으로 코드가 나옴.



근데 위처럼 중복되는 entity들이 존재했을때 이렇게 대충짜면 ambiguity문제가 생김. 그래서 이걸 SFINAE로 해결하고싶으면 다른 entity들을 내포하지 않음을 일일히 선언해줘야되거나 헬퍼함수, 클래스 등으로 약간 복잡하게 처리하거나 아예 SFINAE를 버리고 tag dispatch 혹은 if constexpr 등으로 해결을 해 왔음.


근데 위랑 똑같은 문제를 컨셉으로 직관적이고 간단하게 해결할수있음.


SFINAE랑 똑같이 짯는데 왜 African_american 를 require하는 instantiation에서 ambiguous하다는 에러를 안뱉을까?






Standardese 문체의 글을 읽기 싫은사람들을 위해 쉽게 설명하자면,


Atomic constraint더이상 분해가 되지 않는 constraint임. 이게 무슨뜻이냐면, 컴파일타임에 entity마다 다른 template instantiation 연산을 처리해줘야될때가 오면, Constraint(concept)들은 Atomic constraint가 될때까지 재귀적으로 분해가 된뒤 어떤 Constraint가 더 제약적인지를 따짐. 그 분해가 되는 과정및 규칙은 바로 밑 Constraint normalization에서 설명함.


Constraint normalization은 정의되있는 임의의 concept-definition에서 포함하는 sub-constraint들이 conjunction 혹은 disjunction expression들을 만날때마다 atomic constraint들로 (재귀적으로)분해된다는 뜻이고


Partial ordering by constraints는 현실에서의 비유를 들어서 설명하자면 과일 constraint 와 노란색 과일 둘을 비교했을때

과일 은 노란색 과일 안에 포함되지만, 반대로 노란색 과일과일에 포함이 안된다는 식의 규칙임.


그래서 위 예제 코드에서 kobe_bryant 클래스가 African 컨셉, American 컨셉, African_american 컨셉 셋다 모두에 해당되지만, Constraint normalizationPartial ordering by constraints 규칙으로인해 ambiguity 에러 없이 컴파일이 됨.


굳이 이런거까지 알아야되는 이유는





위에서 정의된 African_american 컨셉이 아까 African(T) && American(T) 로 정의된 African_american 컨셉과 의미 는 같지만 constexpr boolconcept이 아니기때문에 13.5.3, 13.5.4의 규칙이 적용이 안됨. 따라서 concept으로 코드를 짯지만 컴파일러가 ambiguous하다는 에러를 뱉어냄.


그래서 entity들에 따른 템플릿특수화를 concept으로 해결하려면 중복되는 entity들을 따로 빼서 concept들로 정의한뒤 나중에 conjunction 혹은 disjunction expression 들로 조립을 하는식의 정밀한 설계가 필요함.