문제

다음 코드 컴파일 :

auto foo(int i) {
  if( i == 1 )
    return i;
  else 
    return foo(i-1)+i ; 
}

팔로우하는 동안 그렇지 않다, C++1년

auto foo(int i) {
  return (i == 1) ? i : foo(i-1)+i ;  
}

컴파일러가 두 번째 경우의 반환 유형을 추론할 수 없는 이유는 무엇입니까?제가 여기서 뭔가를 놓치고 있는 걸까요?

그 뒤에 시퀀스 포인트가 있다는 걸 알아요 (i == 1) 두 번째 시나리오에서는 컴파일에 영향을 미쳐서는 안 됩니다. 그렇죠?

도움이 되었습니까?

해결책

첫 번째는 이 규칙으로 인해 7.1.6.4/11에서 작동합니다. 최신 초안

한 번 return 진술은 함수에서 나타 났지만, 해당 진술에서 추론 된 반환 유형은 다른 기능을 포함하여 나머지 기능에 사용할 수 있습니다. return 진술.

따라서 반환 유형은 다음과 같이 추론됩니다. int 처음부터 return 성명;두 번째는 단지 그것이 또한 제공하는지 확인하기 위해 검사됩니다. int, 재귀 호출이 수행된다고 가정합니다.

두 번째는 표현식 유형이 반환 유형에 따라 다르기 때문에 컴파일되지 않습니다.그래서 유형을 추론할 수 없습니다.

다른 팁

재귀 함수는 재귀 통화 전에 재귀 적 반환 문이있는 경우에만 자동 리턴 유형을 가질 수 있습니다. NORMAL 함수에 대한 반환 유형 공제 .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top