반환 타입 뒤에 쓰기 운동

C++11에서 Alternative function syntax가 도입되며 다음과 같은 반환 타입 후행 표기가 가능해졌다.

int add1(int a, int b) {
    return a + b;
}

auto add2(int a, int b) -> int {
    return a + b;
}

후행 타입 표기의 장점은 다음과 같다.


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. 긴 반환 타입에 대해 가독성을 보장한다.

함수명은 너무 길거나 짧지 않은 것이 좋다.

따라서 함수명의 길이는 고만고만하다.

하지만 타입 이름은 짧을 수도 있고, 길어질 수도 있다.

이러한 경우 후행 표기는 함수명을 쉽게 찾을 수 있게 해준다.

줄을 맞추기도 편하다.

std::vector< std::pair< std::size_t, int > >::const_reverse_iterator func1();
int func2();

auto func3() -> std::vector< std::pair< std::size_t, int > >::const_reverse_iterator;
auto func4() -> int;

5. 함수 포인터를 반환하는 함수에 대해 가독성을 보장한다.

기존 방식에서는 반환 타입과 함수명이 섞이는 문제가 있다.

하지만 후행 표기는 이를 해결한다.

int (*func1(int a, char b))(short, long long);
auto func2(int a, char b) -> int (*)(short, long long);

6. 코드가 오히려 더 짧아질 수 있다.

이게 뭔 개소리냐고 할 수도 있지만, 다음의 코드를 보자.

struct VeryLongStructName1 {
    using SomeType1 = int;
    SomeType1 func1();
};

VeryLongStructName1::SomeType1 VeryLongStructName1::func1() {
    // ...
}

struct VeryLongStructName2 {
    using SomeType2 = int;
    SomeType2 func2();
};

auto VeryLongStructName2::func2() -> SomeType2 {
    // ...
}

이는 VeryLongStructName2::func2에서 VeryLongStructName2의 컨텍스트가 주어졌기 때문이다.

후행 표기가 항상 더 긴것은 아니다.


이렇듯 반환 타입 후행 표기는 많은 장점을 가지고 있다.

지금부터, 나부터 반환 타입을 뒤에 쓰는게 어떨까?

5 Likes

큰 문제점.

기존의 코드가 반환타입을 앞에다가 쓴다.

2 Likes

포매터를 돌리면 됩니다.

후행표기하는게 좋은거같긴해요.

저도 타입명이 길어질때가 많기도하고
템플릿쓰거나 함수객체리턴같은거 하다보면 필요하더라고요.

그렇지만 일터에 강제하긴 좀 무리가 있는거같 ㅎㅎㅎㅎ
제 개인적으로 하는 프로젝트는 도전해보겠습니다.

1 Like

도사님 도술 엘레강스하네여

2 Likes

반환 타입 후행 표기도 엘레강스하죠.

앞에 auto만 없으면 참 좋을텐데
그러면 선언인지 아닌지 알기 어렵겠네요.

1 Like

후행 표기를 #define fn auto에 싸서 드셔보세요^^

2 Likes

점점 산으로가는 ㅎㅎㅎㅎ

1 Like

main에도 auto를 붙이고 -> 를 할 생각은 아니겠죠?
소신발언 해보십시오

1 Like

예외는 없읍니다, , , ^~^;;

이 주장 반대요!

1 Like

이유도 말씀해 주시면 좋겠어요.

일리가 있네요 확실히 가독성이 좋아지는 것 같기도?!

1 Like

https://google.github.io/styleguide/cppguide.html#trailing_return

짱글은 그냥 이전 스타일을 사용하기로 결정 내렸군요.

훨씬 가독성이 올라가는 극소수의 경우(링크 Pros 참고)만 사용하라네요.

2 Likes

앞에다쓸꺼지롱~

1 Like

:man_facepalming:

구글이 그렇게하자는데 그렇게해야겟네유

2 Likes

협업할땐 포매터 쓰고 평소에는 후행 표기를 쓰는게 어떨까요?^^

뭔 소린진 모르겠는데 그렇게 하겠슴미다

2 Likes