반응형
C ++ 11 "자동"의미
C ++ 11을 사용할 때 auto
값 또는 참조로 해석되는지 여부와 관련하여 유형 추론의 규칙은 무엇입니까?
예를 들어 때때로 명확합니다.
auto i = v.begin(); // Copy, begin() returns an iterator by value
덜 명확합니다.
const std::shared_ptr<Foo>& get_foo();
auto p = get_foo(); // Copy or reference?
static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?
std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?
규칙은 간단합니다. 선언하는 방법입니다.
int i = 5;
auto a1 = i; // value
auto & a2 = i; // reference
다음 예제는 그것을 증명합니다.
#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
}
출력 :
value
reference
value
value
reference
value
§7.1.6.4 [dcl.spec.auto] p6
a의 종류 일단 선언자-ID가 8.3에 따라 결정되었습니다는 사용하여 선언 된 변수의 유형 선언자-ID는 템플릿 인수 공제에 대한 규칙을 사용하여 초기화의 유형에서 결정된다.
이것은 auto
함수 호출 중에 모델 템플릿 인수 추론 을 의미 합니다.
template<class T>
void f(T){} // #1, will also be by-value
template<class T>
void g(T&){} // #2, will always be by-reference
Note that #1 will always copy the passed argument, no matter if you pass a reference or anything else. (Unless you specifically specify the template argument like f<int&>(intref);
.)
Whatever you get from right side ( of "=" ) is never a reference. More specifically the result of an expression is never a reference. In this light, note the difference between results in the example.
#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()
{
auto a3 = bar();
A<decltype(bar())>::foo(); // reference
A<decltype(a3)>::foo(); // value
}
참고URL : https://stackoverflow.com/questions/8542873/c11-auto-semantics
반응형
'program tip' 카테고리의 다른 글
파이썬에서는 왜 인쇄 대신 로깅을 사용합니까? (0) | 2020.11.15 |
---|---|
KnockoutJS에서 $ data 변수의 기원과 목적은 무엇입니까? (0) | 2020.11.15 |
숫자 리터럴의 ULL 접미사 (0) | 2020.11.15 |
내부 클래스가 private final 메서드를 재정의 할 수있는 이유는 무엇입니까? (0) | 2020.11.15 |
MongoDB 원거리 페이지 매김 (0) | 2020.11.15 |