C++ 입문서 5 판, 10 장 (람다 식)을 읽습니다. 벡터의 음수 값을 절대 값으로 대체하는 프로그램입니다. 람다가 void
으로 반환 형식을 유추하지만 우리는이 문제를 해결하기 위해, 우리는 뒤에 반환 유형을 사용해야합니다 값을 반환하기 때문에if-else 문에 대한 λ 식의 반환 유형 공제
가이 코드는 컴파일되지 않습니다 :
transform(vi.begin(), vi.end(), vi.begin(), [](int i) { if (i < 0) return -i; else return i; });
저자는 말한다 .
그러나이 코드를 Windows에서 GNU GCC 컴파일러로 컴파일하면 제대로 작동합니다. 그 유형이 조건 연산자의 유형에서 유추 할 수 있기 때문에 우리는 반환 형식, 를 지정하지 않아도 때문에
이 버전은 컴파일 :
저자는 말한다.
transform(vi.begin(), vi.end(), vi.begin(),
[](int i) { return i < 0 ? -i : i; });
그래서, 내 질문은 :
는 첫 번째 버전으로, 람다는 반환 무효가 입력 추론 왜- 가 왜 GNU GCC 컴파일러는 이것을 받아 들일 않습니다 * (나는 어쩌면 생각했다. 최적화 때문에).?
- 왜 두 번째 버전에서 반환 유형을 조건부 연산자의 유형에서 추론 할 수 있습니까? lambda에서
람다는 반환 된 표현식을 사용하여 반환 유형을 추론하므로 'return'에서 'void'를 추론 할 수 없습니다.이 책에는 오류가 있습니다. –
Quentin
'[] (int i) {if (i <0) return -i; 그렇지 않으면 i를 반환합니다. }'C++ 14에서는 완벽하게 괜찮습니다. – cpplearner
이 책에 쓰여진 내용은 C++ 11에서는 사실 이었지만 C++ 14에서는 여러 개의 return 문을 사용할 수 있도록 개선되었습니다 (반환 된 형식이 일치하는 한). –