질문은 충분히 분명하다고 생각합니다. 의지 auto
키워드 const를-다움을 자동 감지, 또는 항상 예를 들어가있는 경우에도 const가 아닌 유형을 반환합니다. 두 가지 버전의 함수 (하나는 반환 const
하고 다른 하나는 반환 하지 않음).
기록을 const auto end = some_container.end()
위해 for-loops 전에 사용 하지만 이것이 필요한지 아니면 정상과 다른지 모르겠습니다 auto
.
답변:
어쩌면 당신은 혼동 const_iterator
하고 const iterator
. 첫 번째 요소는 const 요소를 반복하고 두 번째 요소는 operators
++ 및-를 사용할 수 없기 때문에 전혀 반복 할 수 없습니다 .
.NET Framework에서 반복하는 경우는 거의 없습니다 container.end()
. 일반적으로 다음을 사용합니다.
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
const auto
이 일반적인 경우에 유용하다?
const auto x = expr;
~와 다르다
auto x = expr;
같이
const X x = expr;
~와 다르다
X x = expr;
따라서 .NET 이없는 경우처럼 const auto
및 const auto&
많이 사용하십시오 auto
.
오버로드 해결은 반환 유형의 영향을받지 않습니다. const
또는 const
lvalue의 no x
가에서 호출되는 함수에 영향을주지 않습니다 expr
.
const
.
두 가지 템플릿이 있다고 가정합니다.
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
한정자입니다.
컴파일러는 자동 한정자의 유형을 추론합니다. 추론 된 유형이 some_type
이면 const auto
로 변환됩니다 const some_type
. 그러나 좋은 컴파일러는 auto
변수 의 전체 범위를 검사 하고 값이 어디에서나 변경되는지 확인합니다. 그렇지 않은 경우 컴파일러 자체는 auto
-> 와 같은 유형을 추론합니다 const some_type
. 나는 Visual Studio Express 2012에서 이것을 시도했으며 생성 된 기계 코드는 두 경우 모두 동일합니다. 각 컴파일러가 그렇게 할 것인지 확실하지 않습니다. 그러나 const auto
다음 세 가지 이유로 사용하는 것이 좋습니다 .
const
을 위해 auto
.const
에 대한 auto
그 어떤 방법으로 프로그램의 기능을 변경하지 않은 경우 . 또한 사용 가능한 const 및 non-const 멤버 함수가 있는지 확인하는 것도 포함됩니다. 컴파일러가 제대로 할 것입니다.
cbegin
및cend
를 반환const_iterator
값으로.const auto
여전히 목적이 있으며 중복되지 않습니다.