2016-09-30 10 views
5

또 다른 질문에 답하면서 정수 또는 부동 리터럴이 발견 될 때만 리터럴 연산자 템플릿이 선언 집합에서 선택된다는 사실을 잊어 버렸습니다. 예를 들어리터럴 연산자 템플릿 : 왜 문자열이 아니겠습니까?

:

template <char... C> 
constexpr int operator "" _x() { 
    return 0; 
} 

그것은 10_x로 사용할 수 있지만이 foo_x으로도 "foo는"_x로도 사용할 수 없습니다.

because the standard says that 외에도, 문자열 리터럴을 처리 할 때 고려하지 않은 기술적 인 이유는 무엇입니까?

나는 (정확히 똑같은 것은 아니지만 아이디어를 제공합니다) 그러나 proposal을 발견했지만 여전히 옵션은 아닙니다.
문자열로 사용할 수없는 이유는 무엇입니까?

+0

''foo "_x'를 원하셨습니까? –

+0

@SebastianRedl 감사합니다. – skypjack

+2

가치가있는 'foo_x'는 식별자이므로 결코 udl을 호출하지 않습니다. – Barry

답변

6

문자 세트 및 인코딩과 관련된 복잡한 점이 있습니다. 문자 집합 인코딩이 런타임과 컴파일 타임간에 다른 경우 어떻게됩니까? 동일한 문자를 인코딩하는 여러 가지 방법이있는 경우 어떻게됩니까? utf-8로 인코딩 된 문자열과 다른 인코딩에서 수행되는 문자열은 무엇입니까? 런타임 문자 집합으로 변환 하시겠습니까?

아마도 쉬운 대답이있을 수 있습니다. 그러나 제안자들이 "ok, we 'll cut this"라는 합병증이 있었고 리터럴이 표준에 들어갔다.

부동 소수점 및 정수 리터럴에 허용되는 문자는 제한되어 있으며이 문제가 없습니다.

하지만 당신은 N2750에 링크 된 문서에 연결하고있는 직접 언급 :

"Hello, " L"Worl\u0044!" 

가있는 문자열 리터럴의 "원시"양식에 대한 수요가있을 수 있습니다

L"Hello, World!" 

과 구별 할 수 있지만 이것은 번역 단계와 심하게 상호 작용하며, 이 기능에 대한 강력한 유스 케이스는 알려져 있지 않습니다.