더북(TheBook)

(norm)*과 같은 연산은 인수의 값을 변경해서는 안 된다. 그러나 벡터를 레퍼런스로 전달하면 실수로 덮어 쓸 위험이 있다. 벡터의 값이 변하지 않았는지 (그리고 복사되지 않았는지) 확인하기 위해 우리는 이 값을 상수 레퍼런스로 전달한다.

double two_norm(const vector& v) { ... }

이 함수에서 v를 변경하려고 하면 컴파일러에서 오류가 발생한다.

값에 의한 호출과 상수 레퍼런스는 인수가 변하지 않지만 서로 다른 방법으로 동작한다.

값으로 전달하는 인수들은 복사본으로 동작하기 때문에 함수 안에서 변경할 수 있다.*

const 레퍼런스에서는 전달한 인수로 직접 작업할 수 있지만, 인수를 변경할 수 있는 모든 연산을 금지한다. 특히 const 레퍼런스 인수는 할당의 좌변(Left-Hand Side, LHS)에 나타나거나 다른 함수에 const가 아닌 레퍼런스로 전달할 수 없다(실제로, 할당의 좌변도 const가 아닌 레퍼런스다).

상수 레퍼런스는 변경 가능한(mutable)* 레퍼런스와 달리 임시 변수를 허용한다.

alpha = two_norm(v + w);

언어 설계 측면에서 완전히 필연적인이지는 않지만 프로그래머의 삶을 훨씬 편하게 만든다.

 

* 역주

벡터 공간의 원소들에 일종의 '길이' 또는 '크기'를 부여하는 함수

 

* 인수가 제대로 복사되었다고 가정한다. 데이터를 손상시키는 복사 작업이 구현된 사용자 정의 타입은 전달된 데이터의 무결성을 손상시킬 수 있다.

 

* 이 책에서는 언어적 이유로 "변경 가능한(mutable)"이란 단어를 "const가 아닌"의 동의어로 사용한다. C++에는 자주 사용하지 않는 mutable이라는 키워드(2.6.3절 참조)도 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.