C ++ 11 auto : 상수 참조를 얻는다면 어떨까요?
다음과 같은 간단한 코드를 살펴보십시오.
class Foo
{
public:
Foo(){}
~Foo(){}
Foo(const Foo&){}
Foo& operator=(const Foo&) { return *this; }
};
static Foo g_temp;
const Foo& GetFoo() { return g_temp; }
나는 다음 auto과 같이 사용하려고했습니다 .
auto my_foo = GetFoo();
나는 그것이 함수의 반환 유형 인에 my_foo대한 상수 참조가 될 것이라고 예상했습니다 Foo. 그러나의 유형 auto이다 Foo없는 기준. 또한, my_foo복사에 의해 생성된다 g_temp. 이 행동은 나에게 그렇게 분명하지 않습니다.
에 대한 참조를 얻으려면 다음 Foo과 같이 작성해야합니다.
const auto& my_foo2 = GetFoo();
auto& my_foo3 = GetFoo();
질문 : auto의 반환 유형을 GetFoo참조가 아닌 객체로 추론하는 이유는 무엇 입니까?
이 기사 읽기 : C ++에서 표시 및 사라지기 consts
C ++ 0x의 자동 변수에 대한 유형 추론은 기본적으로 템플릿 매개 변수와 동일합니다. (내가 아는 한, 둘 사이의 유일한 차이점은 자동 변수의 유형은 이니셜 라이저 목록에서 추론 할 수 있지만 템플릿 매개 변수의 유형은 그렇지 않을 수 있다는 것입니다.) 따라서 다음 선언은 각각 int ( 절대 const int) :
auto a1 = i;
auto a2 = ci;
auto a3 = *pci;
auto a4 = pcs->i;
템플릿 매개 변수 및 자동 변수에 대한 유형 추론 중에는 최상위 const 만 제거됩니다. 포인터 또는 참조 매개 변수를 사용하는 함수 템플릿이 주어지면 가리 키거나 참조하는 모든 항목의 상수가 유지됩니다.
template<typename T>
void f(T& p);
int i;
const int ci = 0;
const int *pci = &i;
f(i); // as before, calls f<int>, i.e., T is int
f(ci); // now calls f<const int>, i.e., T is const int
f(*pci); // also calls f<const int>, i.e., T is const int
이 동작은 C ++ 98 및 C ++ 03 모두에 적용되는 것처럼 오래된 소식입니다. 자동 변수에 해당하는 동작은 물론 C ++ 0x의 새로운 기능입니다.
auto& a1 = i; // a1 is of type int&
auto& a2 = ci; // a2 is of type const int&
auto& a3 = *pci; // a3 is also of type const int&
auto& a4 = pcs->i; // a4 is of type const int&, too
유형이 참조 또는 포인터 인 경우 cv 한정자를 유지할 수 있으므로 다음을 수행 할 수 있습니다.
auto& my_foo2 = GetFoo();
로 지정하지 않아도됩니다 const(에도 동일 함 volatile).
편집 : 참조 대신 값으로 auto반환 유형을 추론하는 이유 GetFoo()는 다음과 같습니다 (주요 질문이었습니다, 죄송합니다).
const Foo my_foo = GetFoo();
위는 my_foo값 이므로 복사본을 만듭니다 . autolvalue 참조를 반환 한다면 위의 것은 불가능합니다.
참고 URL : https://stackoverflow.com/questions/7138588/c11-auto-what-if-it-gets-a-constant-reference
'IT TIP' 카테고리의 다른 글
| 이 Rails JSON 인증 API (Devise 사용)는 안전합니까? (0) | 2020.11.05 |
|---|---|
| 데이터베이스 / SQL : 경도 / 위도 데이터를 저장하는 방법은 무엇입니까? (0) | 2020.11.05 |
| data.table로 할 수없는 data.frame으로 무엇을 할 수 있습니까? (0) | 2020.11.05 |
| 문서 기반 데이터베이스와 관계형 데이터베이스의 장단점 (0) | 2020.11.05 |
| Vim에서 부드럽게 스크롤하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.05 |