// 컴파일 에러
//const int& r = 10; // r = 100; // r은 현재 rvalue이므로 컴파일 에러 발생
// 컴파일 성공
const int i = 100;
const int& r2 = i;
class AAA {
public:
AAA(const AAA& a) {
.. 복사 생성자 구현
}
}
복사 생성자도 엄연한 함수이다. 복사 생성자에서 값으로 인수를 전달하면(복사 생성자의 파라미터가 참조형이 아니라면) 복사 생성자에 대한 호출이 호출 체인으로 이어질 수 있다(복사 생성자 -> 복사 생성자 -> 복사 생성자..).
따라서 컴파일러는 매개변수가 값으로 전달되는 것을 허용하지 않는다.
함수가 참조를 반환할 때 이를 lvalue처럼 사용할 수 있다.
변수 x는 static 변수이기에 프로그램 종료 시점까지 Data 영역에 남아있다.
그리고 변수 x는 static 변수이기에 모든 함수 블록에서 접근할 수 있고, 또한 static int x = 10;
은 오직 한 번만 실행된다.
함수 func()에서 지역변수에 대한 참조를 반환한다. 함수 호출 이후 반환된 메모리 공간에 대해 func() = 30;
과 같이 접근하게 되고, 이는 결국 세그멘테이션 폴트와 같은 런타임 에러를 유발한다.
반환된 메모리 공간에 접근 => 허용되지 않은 공간에 접근했다는 의미로 '세그멘테이션 폴트'를 유발할 수 있다.