decltype 동작의 근거는 무엇입니까?
내가 C ++ 11에서 이해했듯이 decltype(expression)
주어진 표현식의 똑같은 유형을 추론하는 데 사용됩니다. 그러나 표현식 자체를 괄호 안에 넣으면 추론 유형은 표현식 유형에 대한 lvalue 참조 입니다. 예를 들면 :
int x;
decltype(x) y = x;
에 해당 int y = x;
하지만,
int x;
decltype((x)) y = x;
와 동일합니다 int& y = x;
.
각기
decltype(auto) f1()
{
int x = 0;
return x; // decltype(x) is int, so f1 returns int
}
그러나
decltype(auto) f2()
{
int x = 0;
return (x); // decltype((x)) is int&, so f2 returns int&
}
표준위원회에서이 행동을 선택하는 이유는 무엇입니까?
후기 :
지금은의 경우 적어도 그 관찰 GCC 6.2 괄호 안의 표현식이 예를 들어 더 복잡 때 구현 decltype((x + x))
도출 된 유형이 T
있지만 T&
. 이것은 훨씬 더 혼란 스럽습니다. 이 행동이 표준인지 모르겠습니다.
그들은 식별자의 선언 유형을 얻는 방법을 원했습니다.
또한 일시적인지 아닌지에 대한 정보를 포함하여 표현식의 유형을 가져 오는 방법을 원했습니다.
decltype(x)
선언 된 식별자 유형을 제공합니다 x
. decltype
식별자가 아닌 것을 전달 하면 유형을 결정한 다음 &
lvalue, &&
xvalue에 추가 하고 prvalue에는 아무것도 추가 하지 않습니다.
개념적으로 변수 유형과 표현식 유형의 차이로 생각할 수 있습니다. 그러나 그것은 표준이 그것을 설명하는 방식이 아닙니다.
그들은이 두 가지를 의미하기 위해 두 가지 다른 키워드를 사용할 수 있습니다. 그들은하지 않았다.
엔티티와 표현식을 구별 할 필요가 있습니다.
다음 질문을 고려하십시오.
미시시피는 얼마나 걸립니까?
이 질문에 대한 두 가지 답변이 있습니다.
- 미시시피의 길이는 2,320 마일입니다.
- 미시시피는 11 자입니다.
마찬가지로 x
, 의 유형에 대해 질문 할 때 x
식별자를 선언하는 데 사용 된 유형 (예 : 이름과 관련된 유형)을 의미하는지 아니면 x
단독으로 구성된 표현식 유형을 의미하는지 명확하지 않습니다. 그 식별자를 언급합니다. 실제로 오버로드 된 단일 키워드 대신 두 개의 다른 키워드 (예 : entity_type
and expr_type
) 가있을 수 있습니다 decltype
. 어떤 이유로위원회는 decltype
이 두 가지 다른 용도 에 과부하를 걸었 습니다.
decltype
제안 작성자 중 한 명인 J. Jarvi로부터 :
오래되었지만 기억 나는 것은 다음과 같습니다.
이 두 종류의 의미를 구별하기위한 두 개의 별도 키워드는 고려되지 않았습니다. (새 키워드의 도입은 가볍게 이루어지지 않습니다.)
의 의미론의 변경과 관련하여
decltype((x))
핵심 작업 그룹의 토론(x)
은 식별자가 아닌 표현 으로 취급하는 것으로 수렴되었으며 , 이는 아마도 언어 규칙과 "내부적으로 일치"할 수 있습니다.사람들은 이것이 어떤 경우에 잠재적으로 혼란 스러울 수 있다는 것을 알고 있었지만, 합의는 (아마 모든 사람의 선호는 아니지만) 결국 식별자와 표현이 무엇인지에 대한 표준의 사전 정의와 일치하게되었습니다.
[이 질문의 예]에 연결 한 예는 정말 놀랍습니다. 그 당시에 사용하는 반환 표현식에서 함수의 반환 유형을 추론하는
decltype(auto)
것은 아직 언어의 일부가 아니기 때문에이 특정 사용 사례가 누구의 레이더에 있지 않다고 생각합니다.
참조 URL : https://stackoverflow.com/questions/40282118/what-is-the-rationale-behind-decltype-behavior
'IT TIP' 카테고리의 다른 글
관계형 데이터베이스가 Node.js에 적합하지 않습니까? (0) | 2020.12.25 |
---|---|
angularjs에서 우리는 ng-disabled 지시문을 가지고 있는데, ng-show와 ng-hide를 가지고 있기 때문에 프레임 워크에서 ng-enabled 지시문을 제공하지 않는 이유 (0) | 2020.12.25 |
Android DeadSystemException (0) | 2020.12.25 |
사용자 에이전트 HTTP 헤더의 운영 체제 (0) | 2020.12.25 |
SQLite를 사용하는 LINQ (linqtosql) (0) | 2020.12.25 |