C++의 유일한(?) implicit const_cast

C++에는 (아마도 유일한) 묵시적 const_cast 가 있다. 바로,

char* str = "hello, world";

이건 C++이 (최대한) C와의 하위 호환성을 가지려다 보니 나온 문제다. C 표준 라이브러리의 수많은 문자열 처리 함수들이 char* 을 인자로 받긴하지만, 의미 상으론 const char* 인 경우가 대부분이기 때문.

만약 const char* –> char* 을 명시적으로 바꿔야 한다면 많은 수의 C 코드가 C++ 컴파일러에서 컴파일되지 않게 된다. 그래서 이건 묵시적으로 const_cast<char*> 을 해 버린다.

하지만 모든 C 문자열 처리 함수가 const char* 의 의미로 동작하는건 아니다. 그래서 예전 버전의 Mozilla 에선 이와 관련한 버그가 있었다. 공유 문자열 버퍼를 strchr 같이 실제로 버퍼를 조작하는 함수에서 문제가 생기는 것 – _const semantic_이 깨지는 것.

오전에 everclear 군이 제기한 코드. 아래 코드는 왜 컴파일이 성공할까?

struct A {
  int& a;
  explicit A(int& _a) : a(_a) { }
  A(const A& rhs) : a(rhs.a) { }
};

const A&rhs.aconst int& 가 되야 하지 않나? 비슷하게 int& a 대신 int* const a 여도 저 코드는 잘 동작한다; 대체 왜 이럴까?