IT TIP

decltype 동작의 근거는 무엇입니까?

itqueen 2020. 12. 25. 10:39
반응형

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에는 아무것도 추가 하지 않습니다.

개념적으로 변수 유형과 표현식 유형의 차이로 생각할 수 있습니다. 그러나 그것은 표준이 그것을 설명하는 방식이 아닙니다.

그들은이 두 가지를 의미하기 위해 두 가지 다른 키워드를 사용할 수 있습니다. 그들은하지 않았다.


엔티티와 표현식을 구별 할 필요가 있습니다.

다음 질문을 고려하십시오.

미시시피는 얼마나 걸립니까?

이 질문에 대한 두 가지 답변이 있습니다.

  1. 미시시피의 길이는 2,320 마일입니다.
  2. 미시시피는 11 자입니다.

마찬가지로 x, 의 유형에 대해 질문 할 때 x식별자를 선언하는 데 사용 된 유형 (예 : 이름과 관련된 유형)을 의미하는지 아니면 x단독으로 구성된 표현식 유형을 의미하는지 명확하지 않습니다. 그 식별자를 언급합니다. 실제로 오버로드 된 단일 키워드 대신 두 개의 다른 키워드 (예 : entity_typeand 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

반응형