IT TIP

C ++ 11 auto : 상수 참조를 얻는다면 어떨까요?

itqueen 2020. 11. 5. 19:59
반응형

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

반응형