C++ 표준 문서 N2798의 14.3.1의 4번째 항목을 보면. 위와 같은 내용이 있다.
( 더 최신 문서인 N3092 에는 위 항목이 빠져 있음. )
해석을 해서 옮기고 싶지만..
괜히 혼란만 가중 시킬것 같아서.. 패스하고..
아무튼 자세히 보면.. 정말 해괴망측한 부분이 있는데
그 부분을 조금 더 살펴 보자면... 아래와 같은 코드가 있다고 했을 때
1 template<typename T>
2 struct X
3 {
4 static void f(const T& t)
5 {
6 t.a = 100;
7 }
8 };
함수 f()는 const로 받은 변수의 값을 변경하고 있다.
얼핏 보아도 이상한 코드다.
( 아직 template가 instantiation이 되지 않아서 이 부분만 가지고는 컴파일 에러가 나지 않는다.)
코드를 조금 더 작성해 보면..
9 struct S
10 {
11 int a;
12 };
13
14 int main(int argc, char* argv[])
15 {
16 S s;
17 X<S>::f(s);
18
이제 아마 Line 17에서 readonly인 a에 값을 넣으려고 했다고 해서 컴파일 에러가 날 것이다.
근데 C++0x 부터는 이를 회피할 수 있는 아주 간단한 방법이 생겼다.
단순히 ' & ' 하나만 추가 하면 된다.
16 S s;
17 X<S&>::f(s);
18
19 cout << s.a << endl;
이제 함수 f()는
void X::f(S& t) 와 같이 파라미터의 타입이 정해지고, const 속성을 날려버리게 된다. 우왕ㅋ굳ㅋ
( 물론, 이렇게 만들어서 const 속성을 없애서 쓰자는 이야기는 절대 아님...)
C++의 복잡도는.. 날이 갈 수록 올라가고 있다.
끝으로 Quiz..
각각 파라미터 타입은 어떻게 될까요? ( Line 11 ~ Line 29 )
참고로 gcc 4.5.0과 VS2010 에서 둘다 돌려봤는데. 같게 나왔습니다.
1 template<typename T>
2 struct R
3 {
4 static void A(T&){}
5 static void B(const T&){}
6 static void C(T&&){}
7 static void D(const T&&){}
8 };
9
10 {
11 R<int&>::A(?)
12 R<int&>::B(?)
13 R<int&>::C(?)
14 R<int&>::D(?)
15
16 R<const int&>::A(?)
17 R<const int&>::B(?)
18 R<const int&>::C(?)
19 R<const int&>::D(?)
20
21 R<int&&>::A(?)
22 R<int&&>::B(?)
23 R<int&&>::C(?)
24 R<int&&>::D(?)
25
26 R<const int&&>::A(?)
27 R<const int&&>::B(?)
28 R<const int&&>::C(?)
29 R<const int&&>::D(?)
30 }