2013-07-06 4 views
30

는 :사용하여 자동 ++ 나는 다음과 같은 코드/서명이 일치하지 서명 경고를받을

auto n = a.size(); 
for (auto i = 0; i < n; i++) { 
} 

문제는 i에 0을 할당하여이 int보다는 size_t 될 것입니다.

size_t n = a.size(); 
for (size_t i = 0; i < n; i++) { 
} 

나이 : 은 그래서 더 낫다

auto n = a.size(); 
for (size_t i = 0; i < n; i++) { 
} 

또는 어쩌면 당신은 더 나은 솔루션이 있습니까? 조금 더 일관성이 있기 때문에 첫 번째 것을 더 좋아합니다. 같은 목적으로 size_tauto 이 아닌 size_t을 사용하기 때문에 더 좋아합니다. 여기

for (const auto& i : a) 
{ 

} 

i 컨테이너 a의 요소에 대한 참조 const이다

+3

'auto i = 0u'은 어떻습니까? – jalf

+0

루프에서 인덱스가 필요한 경우 int를 사용하는 것이 어떻습니까? 서명되지 않은 인덱스를 사용하면 매우 빠르게 불쾌해질 수 있습니다. 예 : 'i'와'n'이 부호없는 경우'i

답변

38

범위 기반 루프 청소기 용액 일 수있다.

그렇지 않으면 색인이 필요하거나 전체 범위를 반복하지 않으려면 decltype(a.size())으로 유형을 가져올 수 있습니다.

for (decltype(a.size()) i = 0; i < a.size(); ++i) { 
} 
+4

범위 기반 루프의 문제점은 인덱스를 사용할 수 없다는 것입니다. – RiaD

+0

실제로 큰 문제입니다. 실제로 인덱스를 별도로 관리하고 싶지는 않습니다. – user2381422

+0

고맙습니다. C++ 11에서는 범위 기반 루프를 도입했습니다. – stepanbujnak

18

는 루프와 컴파일러의 기능 내에서 수행 할 작업에 따라 범위 기반 루프는 더 나은 해결책이 될 수 있습니다.

대부분의 상황에서 제시된 모든 솔루션은 사소한 차이가 있습니다. 첫 번째 해결 방법은 실제로 더 나쁜 선택이며 바로 컴파일러에서 알려줍니다. 두 번째 솔루션은 더하지만 단순성 유형 또는 일부 미래의 변화를 정의 직접 피하려면, 다음을 수행 할 수 있습니다

auto n = a.size(); 
for (decltype(n) i = 0; i < n; i++) { 
} 

당신이 in 유형을 결합이 방법은 항상 서로 일치 할 수 있습니다.

5

정확한 리터럴을 사용했다면 0U가됩니다. auto는 int 타입의 리터럴을 본다. 그래서 그것은 i의 타입이다. U를 추가하면 부호없는 int 리터럴이 대신 표시됩니다. 그렇지 않으면 sizeof (size_t)가 sizeof (int) (64 비트 긴 모드로 실행되는 경우 Windows, OS X 등)보다 클 수 있기 때문에 decltype을 다른 방식대로 사용하고 싶을 것입니다.

+2

표준에 따라'sizeof (0U)'가 항상'sizeof (size_t)'입니까? – Flexo

+0

@Flexo : 그것을 반영하고 다른 답변의 수락을 장려하기 위해 편집 됨. –

+0

-1. Flexo가 말한 것처럼이 답변의 전반부는 잘못되었습니다. 그리고 후반부는 기본적으로 "다른 대답이 말하는대로하십시오"라고 말합니다. "다른 답변 수락을 장려"하고 싶다면이 답변을 삭제할 수 있습니다. – interjay

-2
for(auto n = a.size(), i = 0; i != n; ++i) { 
} 

... 실제 요소는 물론 색인에 액세스해야하는 경우 가장 깨끗한 해결책 일 수 있습니다.

업데이트 : 그것은 더 이상 그 깨끗한 보이지 않지만

for(auto n = a.size(), i = n*0; i != n; ++i) { 
} 

가, 리처드 스미스의 의견에 대한 해결 될 것입니다.토론을위한

+4

이것은 정확하지 않습니다 : 여러 변수를 선언하는'auto' 선언에서,'auto'는 각 변수에 대해 독립적으로 추론되며 추론 된 유형이 동일하지 않으면 코드가 잘못 형성됩니다. –

2

: int보다 작은 유형의 경우, 빼기 결과가 int (라는 정수 프로모션)로 넓어 것을

auto n = a.size(); 
for (auto i = n-n; i<n; ++i) { 
} 

참고.

const auto n(a.size()); 
for (auto i = decltype(n){0}; i < n; ++i) 
{ 
} 

그렇지 않은 매우 간결, 그러나 당신이 n의 유형 0 (및 n으로 초기화 변수를 원하는 것이 분명 : CONST-올바른 가능하면 되려고

1

, 나는 보통 쓰기 const).

0

여기에 간단한 & 클리너 솔루션이 있습니다.

for(auto i: a) 
{ 
}