2013-10-16 4 views
6

와 문자 정의 :내가 궁금하네요 메서드 호출

constexpr double radius = 27_km.to_miles(); // _km returns Distance instance 
              // which has to_miles() 

모두 GCC 4.8.1와 연타 3.4은 문자 연산자를 찾을 수 없습니다 불평 operator"" _km.to_miles 내가 괄호 안에 27_km 포장되지 아니하는 표준의 섹션 2.14.8의 내 독서에 의해

constexpr double radius = (27_km).to_miles(); // fine 

을하는 UDL 접미사는 기간을 포함 할 수 없습니다, 그래서 왜 컴파일러는 다음과 같이 코드를 파싱? 그들은 맞습니까? 아니면 버그입니까?

편집 : 당신은 여기에 (다른 UDL 및 방법 이름) 전체 예를 볼 수 있습니다 http://ideone.com/rvB1pk

+0

나는 C++ 11의이 기능을 알지 못했다. 고마워! – orlp

+1

오류가 발생한 전체 예제를 보여줄 수 있습니까? –

+0

예에 대한 링크를 추가했습니다. –

답변

2

이것은 렉서 문제 일 수 있습니다. 사용자 정의 리터럴은 단일 청크로 토큰 화됩니다. 숫자와 접미사는 하나의 전체 토큰입니다. 숫자 리터럴의 경우 slurp가 허용되는 문자에는 십진수 '.'가 포함됩니다. Lookup pp-number : 표준의 latest draft에있는 섹션 2.10 - lex.ppnumber. 전처리 (렉서는) 토큰을 스캔 할 방법을 통해 걸어 :

30_au.to_light_years() 

digit 
digit 
identifier-nondigit 
. 
identifier-nondigit x 14 
(breaks the spell 

는 그래서 전처리 큰 이상한 (부동 소수점) 숫자로 30_au.to_light_years 본다. 그런 다음 나중에, 숫자 구문 분석 단계에서 우리는 digit, digit, identifier-nondigit...을 봅니다. 그 시점에서 '-'이후의 나머지는 접미어 식별자로 전달됩니다.

전 처리기 토큰 화 후 이후에 숫자 리터럴이 인 것으로 기억하십시오.

실제로 이것은 이 아니라고 생각합니다.에 결함이 있습니다.

+0

2.10 절을 읽은 후에 나는 동의합니다 - 불편 함이 있지만 결함처럼 보이지 않습니다! –

+0

@AlexKorban : §2.2/7을 본 후에 동의하지 않습니다. "토큰을 분석하고 번역하는 과정에서 때때로 하나의 토큰이 일련의 다른 토큰으로 대체 될 수 있습니다". 하나의 전 처리기 토큰으로 시작한다고해서 컴파일하는 동안 하나의 토큰을 유지할 수있는 것은 아닙니다. –

+0

@ JerryCoffin :이 노트는 특별히 14.2 ("템플릿 전문화의 이름")을 나타내며, >>의 모호성에 관한 것으로 보입니다. 그래서 emsr의 해석은 여전히 ​​정확합니다. 내가 놓친 게 있니? –

3
UDL의 접미사 (선행 밑줄) 정상 식별자가 있어야하는데, 그래서처럼 보이는

나 버그.