'const auto'에는 어떤 의미가 있습니까?


82

질문은 충분히 분명하다고 생각합니다. 의지 auto키워드 const를-다움을 자동 감지, 또는 항상 예를 들어가있는 경우에도 const가 아닌 유형을 반환합니다. 두 가지 버전의 함수 (하나는 반환 const하고 다른 하나는 반환 하지 않음).

기록을 const auto end = some_container.end()위해 for-loops 전에 사용 하지만 이것이 필요한지 아니면 정상과 다른지 모르겠습니다 auto.

답변:


31

어쩌면 당신은 혼동 const_iterator하고 const iterator. 첫 번째 요소는 const 요소를 반복하고 두 번째 요소는 operators++ 및-를 사용할 수 없기 때문에 전혀 반복 할 수 없습니다 .

.NET Framework에서 반복하는 경우는 거의 없습니다 container.end(). 일반적으로 다음을 사용합니다.

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }

12
cbegincend를 반환 const_iterator값으로. const auto여전히 목적이 있으며 중복되지 않습니다.
dalle

2
그래서 const auto이 일반적인 경우에 유용하다?
rubenvb

@dalle : 댓글을 달기 전에 내 단락을 삭제했습니다. 내가 말도 안되는 말
Benoit

2
누군가가 너무 많은 SQL을 작성하고 있습니다. :)
Andres Jaan Tack

3
auto는 &로 const에 의해 수정되며 foreach에서 사용할 수 있습니다. 예 : en.cppreference.com/w/cpp/language/auto
Janosimas

97
const auto x = expr;

~와 다르다

auto x = expr;

같이

const X x = expr;

~와 다르다

X x = expr;

따라서 .NET 이없는 경우처럼 const autoconst auto&많이 사용하십시오 auto.

오버로드 해결은 반환 유형의 영향을받지 않습니다. const또는 constlvalue의 no x가에서 호출되는 함수에 영향을주지 않습니다 expr.


17
아니요. 변수를 수정하지 않거나 수정하지 않으려면으로 선언해야합니다 const.
Paul J. Lucas

7

두 가지 템플릿이 있다고 가정합니다.

template<class U> void f1( U& u );       // 1
template<class U> void f2( const U& u ); // 2

auto타입을 추론하며, 가변 파라미터와 동일한 종류 것이다 u합니다 (같이 // 1, 케이스) const auto파라미터가 가변으로 동일한 유형의 것 u에 갖는 // 2경우. 그러니 const auto강제 const한정자입니다.


3

컴파일러는 자동 한정자의 유형을 추론합니다. 추론 된 유형이 some_type이면 const auto로 변환됩니다 const some_type. 그러나 좋은 컴파일러는 auto변수 의 전체 범위를 검사 하고 값이 어디에서나 변경되는지 확인합니다. 그렇지 않은 경우 컴파일러 자체는 auto-> 와 같은 유형을 추론합니다 const some_type. 나는 Visual Studio Express 2012에서 이것을 시도했으며 생성 된 기계 코드는 두 경우 모두 동일합니다. 각 컴파일러가 그렇게 할 것인지 확실하지 않습니다. 그러나 const auto다음 세 가지 이유로 사용하는 것이 좋습니다 .

  • 코딩 오류 방지. 이 변수를 변경하지 않으려 고했지만 범위 어딘가에서 변경되었습니다.
  • 코드 가독성이 향상되었습니다.
  • 몇 가지 이유가 추론하지 않는 경우 컴파일러 도움 const을 위해 auto.

컴파일러는 가능한 경우 const를 추론하지 않습니다. 유형을 추론하는 표현식이 이미 const 인 경우에만 const를 추가합니다. 컴파일러가 가능하기 위해 const를 추가하면 특정 컴파일러가 const를 추론 할 수 있는지 여부에 따라 const 대 non-const 멤버 함수가 호출되는 것과 같이 프로그램 의미 체계가 깨질 수 있습니다. 그래서 나는 당신의 마지막 요점이 틀렸다고 생각합니다.
rubenvb

@rubenvb C ++ 표준을 사용하면 컴파일러가 원하는 최적화에 따라 적합한 방식으로 코드를 재구성 할 수 있습니다. 컴파일러가 추론하는 것은 완벽하게 합법적 인 const에 대한 auto 그 어떤 방법으로 프로그램의 기능을 변경하지 않은 경우 . 또한 사용 가능한 const 및 non-const 멤버 함수가 있는지 확인하는 것도 포함됩니다. 컴파일러가 제대로 할 것입니다.
BJovke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.