C++11에서 Alternative function syntax가 도입되며 다음과 같은 반환 타입 후행 표기가 가능해졌다.
후행 타입 표기의 장점은 다음과 같다.
1. 다른 언어와 비슷하다.
다음은 여러 언어로 작성한 add 함수다.
[Haskell]
add :: Int -> Int -> Int add a b = a + b[Rust]
fn add(a: i32, b: i32) -> i32 { a + b }[Python]
def add(a: int, b: int) -> int: return a + b모두 후행 반환 타입을 사용하는 것을 알 수 있다.
물론, 이들 언어를 동일선상에서 비교하는 것은 무리가 있다.
Haskell은 currying이 적용되고, Rust는 반환 타입 추론을 해주지 않으며, Python은 타입 표기를 하지 않아도 된다.
하지만, 다른 언어와의 공통점을 가져가는 것은 여러모로 이롭다.
2. 람다와 일관성이 있다.
C++ 람다는 ->를 사용한 타입 표기밖에 하지 못한다.
람다와의 일관성을 위해 일반 함수에서도 후행 표기를 쓰는 것이 좋다.
3. 반환타입을 추론하는 함수와의 일관성이 있다.
C++에서 반환 타입이 너무 긴 함수는 auto만 쓰는 것이 좋다.
그런데, auto 자체는 타입의 이름이 아니다.
다른 함수들의 경우 타입의 이름이 올 자리에 auto가 떡하니 박혀버리는 것이다.
그렇다면 auto를 먼저 쓰고 타입을 후행 표기로 optional하게 쓰는 편이 일관성있다.
4. 긴 반환 타입에 대해 가독성을 보장한다.
함수명은 너무 길거나 짧지 않은 것이 좋다.
따라서 함수명의 길이는 고만고만하다.
하지만 타입 이름은 짧을 수도 있고, 길어질 수도 있다.
이러한 경우 후행 표기는 함수명을 쉽게 찾을 수 있게 해준다.
줄을 맞추기도 편하다.
5. 함수 포인터를 반환하는 함수에 대해 가독성을 보장한다.
기존 방식에서는 반환 타입과 함수명이 섞이는 문제가 있다.
하지만 후행 표기는 이를 해결한다.
6. 코드가 오히려 더 짧아질 수 있다.
이게 뭔 개소리냐고 할 수도 있지만, 다음의 코드를 보자.
이는 VeryLongStructName2::func2에서 VeryLongStructName2의 컨텍스트가 주어졌기 때문이다.
후행 표기가 항상 더 긴것은 아니다.
이렇듯 반환 타입 후행 표기는 많은 장점을 가지고 있다.
지금부터, 나부터 반환 타입을 뒤에 쓰는게 어떨까?
개인적으로 리턴타입 뒤에 두는 건 decltype에 해당될 때만 쓴다만. 안 그래도 되는 거에 쓰는 건 불필요해보여서.
그리고 나 같은 경우엔 리턴타입 길어지면 들여쓰기함
비밀추천 낭낭하게..^^
반환 타입 길면 뭔지 읽기도 힘듦. 앞에 auto로 정렬되는게 ㄹㅇ 좋은듯.
집중하고읽다 갑자기 8비추보이는거 웃기네ㅋㅋㅋㅋ
좋아보이는데 비추가 더 많아서 비추 눌렀습니다
야이새키야 ㅡ,ㅡ
비추 낭낭하게 드렸읍니다
함수포인터는 나름 쓸만한듯
함수포인터랑 auto로 정렬되는건 좋은 것 같은데
비추 왤케 많음