2011-11-11 2 views
1

최근에 gcc-trunk 소스에서 "사용자 정의 리터럴"이 구현되었습니다. 제발 말해줘, 나는 variadic char 템플릿에 대해 "사용자 정의 리터럴"을 정의 할 수 없다는 것을 정확히 이해합니까?variadic char 템플릿에 대한 사용자 정의 리터럴

template<char... chars> 
int operator"" _call() { return sizeof...(chars); } 
... 
std::cout << "method"_call; 

up. 이 표현이 허용되는 이유를 이해 돈`t

:이 하나가 허용되지

template<char... chars> 
int operator"" _call() { return sizeof...(chars); } 
... 
std::cout << 12345566_call; 

을 :

template<char... chars> 
int operator"" _call() { return sizeof...(chars); } 
... 
std::cout << method_call; 

?

무엇이 요점입니까?

업. 이것은 모호성 때문입니까?

감사합니다.

답변

1

method_call은 유효한 식별자입니다 (예 : some_call 또는 my_call). 그런 식별자가 operator""으로 재정의되도록 허용 된 경우 얼마나 많은 코드가 손상 될지 상상해보십시오.

8

아니요, 실제로 의미가 없습니다. 문자열 리터럴이 operator""에 두 개의 인수로 전달, 그 중 하나는 크기입니다, 그래서 당신이 원하는 무엇인가 :

size_t operator"" _call(const char*, size_t len) { 
    return len; 
} 

표준 견적 시간 (2.14.8.5)이 :

5 L가있는 경우 사용자 드 Fi를 네드 - 문자열 리터럴, STRUD-접미사없이 문자를하고 STR (즉, 길이 코드 단위의 숫자가 될 수 있도록하자 종료 널 문자 제외). 리터럴 L은 가변 템플릿 형태 만이 고려된다

operator "" X (str, len) 

형태의 호출로 처리되고 리터 정수 네드 (2.14.8.3) 및 사용자 드 인터넷 네드 - 부동 사용자 드 파이 리터럴 (2.14.8.4)

method_call의 경우 method은 리터럴이 아닙니다.

+0

이 변형에 대해 알고 있습니다. 하지만 난 variadic char 템플릿을 기대했다. – niXman

+1

@niXman : "변형"이 아닙니다. 그것이 표준에 의해 정의되는 방법입니다. 사용자 정의 적분과 부동 소수점 리터럴 만'template '형식을 사용할 수 있습니다 (그래서 첫 번째 코드 조각에서'12_call'이 작동합니다). –

관련 문제