>  기사  >  백엔드 개발  >  `decltype`에 이중 괄호를 사용하면 결과 유형이 변경되는 이유는 무엇입니까?

`decltype`에 이중 괄호를 사용하면 결과 유형이 변경되는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-31 11:15:29833검색

Why Does Using Double Parentheses in `decltype` Change the Resulting Type?

decltype에서 이중 괄호를 사용한 유형 추론

C에서는 decltype 키워드를 사용하여 표현식의 유형을 결정할 수 있습니다. 이중 괄호와 함께 사용하면 혼란을 초래할 수 있는 미묘한 동작을 보입니다.

문제:

다음 코드 조각을 고려하세요.

<code class="cpp">const int&&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i;     // type is const int&&&
decltype(i) x2;             // type is int
decltype(a->x) x3;          // type is double
decltype((a->x)) x4 = x3;   // type is const double&</code>

네 번째 줄의 a->x에 괄호를 추가하면 결과 유형이 double에서 const double&로 변경되는 이유는 무엇입니까?

답변:

설명은 다음에 있습니다. decltype을 사용하여 유형을 추론하는 규칙. C 언어 표준에 따르면:

  1. e가 괄호로 묶이지 않은 식별자이거나 클래스 멤버 액세스인 경우 decltype(e)는 e가 명명한 엔터티의 유형을 반환합니다.
  2. e가 은 l값이고, decltype(e)는 T&를 반환합니다. 여기서 T는 e의 유형입니다.

주어진 예에서:

  • decltype(a->x) a->x를 클래스 멤버 액세스로 해석하여 double 유형이 됩니다.
  • decltype((a->x))는 (a->x)를 lvalue로 해석하여 a가 됩니다. const double& 유형.

따라서 a->x에 괄호를 추가하면 액세스된 멤버 유형에서 유형 공제가 멤버 자체에 대한 참조로 변경됩니다.

위 내용은 `decltype`에 이중 괄호를 사용하면 결과 유형이 변경되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.