질문은 충분히 분명하다고 생각합니다. 의지 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또는 constlvalue의 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여전히 목적이 있으며 중복되지 않습니다.