본문 바로가기
Computer Science/C++

충격!) C++에서 Rust의 블록 표현식과 유사한 구문을 사용할 수 있다?!

by invrtd.h 2024. 3. 4.

Rust는 {}으로 감싸지는 코드 블록이 단순한 문장들의 나열이 아니라 하나의 표현식(Expression)으로 사용될 수 있다.

let x = ???
let result = {
    let x0 = if x >= 0 {x} else {0};
    x0 * x0 * x0 + 3 * x0
};

 

코드블록의 마지막 문장인 x0 * x0 * x0 + 3 * x0 뒤에 세미콜론이 찍혀 있지 않으므로, 코드블록은 x0 * x0 * x0 + 3 * x0으로 평가되는 표현식(Expression)이 된다. 따라서 result에 해당 값이 들어간다.

 

이런 구문은 이름공간의 오염을 줄이는 역할을 한다. result를 계산할 때 말고는 절대로 x0가 다시 사용되지 않는다는 것을 알고 있다면 코드 블록을 사용하여 x0을 특정 영역 안에 가둬버릴 수 있다. 이런 식으로 코드를 짜면 프로그래머가 나중에 코드를 다시 읽기도 편하다. x0가 코드 블록 밖에서 사용되지 않는다는 것을 알 수 있으므로 프로그래머는 나중에 x0이 다른 곳에서 다시 사용되는지 알기 위해 x0의 이름을 기억할 필요가 없기 때문이다.

 

C++에서도 비슷한 기능을 사용할 수 있다. 그러나 문법이 더러운 편이다. 현업에서 자주 사용되는 패턴이 아니라면 팀원 간 의사소통에 문제가 있을 수 있음을 의식하고 사용하여야 한다.

 

int x = ???
int result = [&] {
    int x0 = x >= 0 ? x : 0;
    return x0 * x0 * x0 + 3 * x0;
}();

 

이 구문은 모든 변수를 참조자 캡처하는 람다 함수를 생성한 뒤 그 자리에서 바로 생성한 함수를 호출해 버린다. x0는 람다 함수 내부의 변수이므로 람다 함수 밖에서 x0를 사용할 수 없다.

 

성능 저하가 있지 않을까? -> 추측하건대 나는 컴파일러가 인라인화를 자동으로 해 줄 것이라 생각한다. 

댓글