> 백엔드 개발 > C++ > 본문

C 11의 `auto`는 언제 값이나 참조를 추론합니까?

Linda Hamilton
풀어 주다: 2024-11-03 15:35:02
원래의
898명이 탐색했습니다.

When does `auto` in C  11 deduce a value or a reference?

C 11 "auto" 의미의 미묘함

C 11에서 auto 키워드는 초기화 프로그램을 기반으로 변수 유형을 자동으로 추론하는 편리한 방법을 제공합니다. . 그러나 auto가 값 또는 참조로 해석되는지 여부와 관련하여 고려해야 할 특정 사항이 있습니다.

규칙 이해

규칙은 간단합니다. 변수가 선언되는 방식에 따라 다릅니다.

<code class="cpp">int i = 5;
auto a1 = i;    // value
auto &a2 = i;  // reference</code>
로그인 후 복사

첫 번째 경우 a1은 참조로 선언되지 않았기 때문에 값입니다. 두 번째 경우에는 a2가 명시적으로 하나로 선언되었기 때문에 참조입니다.

불확실성 명확화

제공한 예에 이 규칙을 적용해 보겠습니다.

  • auto p = get_foo();: get_foo()는 스마트 포인터에 대한 참조를 반환합니다. p는 참조 없이 선언되므로 복사본이 되어 참조 유형 객체가 됩니다.
  • auto sp = s_foo;: s_foo는 스마트 포인터에 대한 정적 참조입니다. sp에 할당하면 참조가 복사되어 참조 유형 객체가 생성됩니다.
  • for (auto foo: c): foo는 벡터에 있는 각 반복자의 복사본이 됩니다. 참조로 선언되지 않았기 때문입니다.

템플릿 메타프로그래밍으로 증명

다음 코드는 템플릿 메타프로그래밍을 사용하여 이 동작을 보여줍니다.

<code class="cpp">#include <typeinfo>
#include <iostream>

template< typename T >
struct A
{
    static void foo(){ std::cout << "value" << std::endl; }
};
template< typename T >
struct A< T&amp;>
{
    static void foo(){ std::cout << "reference" << std::endl; }
};

float& bar()
{
    static float t=5.5;
    return t;
}

int main()
{
    int i = 5;
    int &r = i;

    auto a1 = i;
    auto a2 = r;
    auto a3 = bar();

    A<decltype(i)>::foo();       // value
    A<decltype(r)>::foo();       // reference
    A<decltype(a1)>::foo();      // value
    A<decltype(a2)>::foo();      // value
    A<decltype(bar())>::foo();   // reference
    A<decltype(a3)>::foo();      // value
}</code>
로그인 후 복사

출력:

value
reference
value
value
reference
value
로그인 후 복사

이는 auto 유형이 초기화 유형이 아니라 선언에 의해 결정된다는 것을 확인시켜 줍니다.

위 내용은 C 11의 `auto`는 언제 값이나 참조를 추론합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!