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 중국어 웹사이트의 기타 관련 기사를 참조하세요!