2017-10-02 5 views
3

나는 뭔가를 놓치고 있는지 잘 모르겠지만 아무것도 반환 할 수있는 사용자 정의 함수를 호출하는 사용자 정의 리터럴도 일종의 리터럴입니다.문자열이 아닌 리터럴은 prvalues입니까?

이 표준은, 그것이 문자열 리터럴이 아닌 리터럴이 prvalue는 항상 말한다 but : 입증한다 모두 GCC와 연타에

#include <iostream> 
#include <typeinfo> 

int& operator""_a(unsigned long long c); 

int main() 
{ 
    std::cout << std::is_same<decltype(5_a), int&>::value; 
} 

인쇄 1, 리터럴 5_a의 (a하지 않은 것을 문자열 리터럴) 대신 r- 수치의 좌변으로 처리되고 :

[expr.prim.literal]/1리터럴는 일차 식이다. 유형은 형식에 따라 다릅니다. 문자열 리터럴은 왼쪽 값입니다. 다른 모든 리터럴은 prvalues입니다.

사용자 정의 리터럴 literals too이다.

내가 무엇을 누락 했습니까?

+0

[이 값 카테고리 참조] (http://en.cppreference.com/w/cpp/language/value_category)에 따르면 lvalues에는 "반환 값 유형이 lvalue reference 인 함수 호출 또는 오버로드 된 연산자 표현식"이 포함됩니다. 사용자 정의 리터럴이 실제로 무엇인지는 오버로드 된 연산자입니다 (예를 들어 '5_a'는 호출 연산자 '_a (5)'와 같습니다). 그리고 연산자 함수는 lvalue 참조를 반환합니다. lvalue 참조는 같은 유형의 lvalue 참조와 비교됩니다. –

+0

@Someprogrammerdude하지만 리터럴이기도합니다. 게다가, 이탤릭체 *로 쓰여 있으며, 리터럴 * 구문 규칙에 따라 모든 생성자를 참조한다는 것을 강조하기 위해 표준에 모순이있을 수 없다고 말하고 싶습니다. –

+5

@ Peregring-lk 표준은 인간이 작성한 문서입니다. 모순을 포함 할 수 없다는 것은 무엇을 의미합니까? 표준 정의를 사용해서는 안되지 만 어쨌든 그렇게하는 것은 아마도 그 중 하나 일 수 있습니다. –

답변

4

예, 이것은 표준의 경미한 문구 결함입니다. 당신은 N1905에있는 모든 돌아 오는 길에 그 문장 (거의) 변화 찾을 수 있습니다

문자가 기본 표현이다. 유형은 형식에 따라 다릅니다 (2.13). 문자열 리터럴은 왼쪽 값입니다. 다른 모든 리터럴은 rvalues입니다.

이 표준은 몇 년 (N2765은 2008 년 중반부터이다)에 의해 사용자 정의 리터럴을 선행하고,이 특정 문구는 "다른 모든 리터럴 [P] 우변은"그 부분의 shouldn을 반영하기 위해 변경되지 않았습니다 사용자 정의 리터럴을 포함하지 않습니다.

그러나 사용자 정의 리터럴은 function call에 대한 구문 설탕이므로 해당 값 범주는 함수 호출에서도 파생되어야 함을 분명히 알 수 있습니다. 그것이 언어 기능의 요점입니다. 귀하의 예제에서 5_a의 값 카테고리가 가치가 아니라 값이 아니라는 (모든 컴파일러가 동의 함) 혼란이 없으므로,이 문구에 대한 결함 보고서가있는 경우 우선 순위가 상당히 낮아질 수 있습니다.

관련 문제