>  기사  >  백엔드 개발  >  C 11에서 \"auto\"는 언제 값이나 참조를 추론합니까?

C 11에서 \"auto\"는 언제 값이나 참조를 추론합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-02 21:52:30439검색

When Does

C 11 "auto" 의미 이해

C 11에서 "auto" 키워드는 자동 유형 추론을 허용합니다. 그러나 값으로 해석되는지 아니면 참조로 해석되는지 결정하는 것이 때때로 모호할 수 있습니다.

유형 추론 규칙:

"auto"의 유형 추론 규칙은 간단합니다. : 객체가 선언된 방식에 따라 다릅니다.

예를 들어:

<code class="cpp">int i = 5;</code>

선언하면:

<code class="cpp">auto a1 = i;    // value
auto &a2 = i;  // reference</code>

a1이 값 유형으로 공제됩니다. (int), a2는 참조 유형(int&)으로 공제됩니다.

모호한 경우:

다음 예를 고려하세요.

<code class="cpp">const std::shared_ptr<Foo>& get_foo();
auto p = get_foo(); // Copy or reference?</code>

get_foo는 참조를 반환하지만 p는 "auto"로 선언됩니다. 이 경우 auto는 p 유형을 Foo에 대한 참조로 추론합니다.

<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>

s_foo는 Foo에 대한 공유 포인터의 정적 인스턴스입니다. sp는 "auto"를 사용하여 선언되므로 Foo에 대한 공유 포인터로 공제됩니다.

<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>

여기서 "auto"는 벡터를 반복하여 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&& >
{
    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

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

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