간단한 Linked List 클래스를 만들다가 의문을 갖게 되었습니다.
요런 클래스를 만들 때 일반적으로 자료형을 template으로 지정할텐데요...

예를들어
[code]
template <class T>
class LinkedList {
public:
    void Insert(T& value);
    ...
};
[/code]

뭐 저렇게 해두면, LinkedList<int>::Insert 인 경우...
30 같이 직접 숫자를 넣으면, int를 int &로 바꿀 수 없다는 컴파일 오류가 뜨더군요.

[code]
void test(int& value)
{
    printf("test = %d", value);
}

...
test(30);   // error C2664: 'test' : 매개 변수 1을(를) 'int'에서 'int &'(으)로 변환할 수 없습니다.
[/code]


그렇다고 T& 대신 T를 쓴다면, 구조체 같이 커다란 뭉텅이를 다루는 경우 손해볼 것 같고...
T&를 쓰면 기본 자료형 같은 놈들은 값을 바로 입력하기가 힘들고...
T형과 T& 형을 모두 두면 컴파일러가 구분을 못 하지요.

궁여지책으로
[code]
template <class T>
class value {
public:
        value(T v) { data = v; }
        operator T& () { return data; }
private:
        T data;
};
[/code]

이런 비참한 걸 만들어놓고 Insert(value<int>(30)); 하는 방법도 생각해봤었으나...
-_-


그런데, 비슷한 클래스인데도 STL에 나온 놈들은 그냥 숫자를 입력해도 잘 되더군요.
차이가 뭘까 해서 살펴보니 STL에 있는 것들은 const가 붙는 겁니다.


그래서 저도 const를 붙여보니 잘 되더군요.
물론 const를 붙여도 일단은 T&이므로, 컴파일러가 스택에 임시 변수를 만들어서 주소를 넘겨주지만...
(전부터 VB에서 말하는 ByRef 로 인자를 넘기면 상수도 그냥 슥슥 넘기길래 어떻게 한 걸까 궁금했는데 VB도 그냥 임시 변수를...)


[code]
void test(const int& value) // const 추가
{
    printf("test = %d", value);
}

...
test(30);   // OK
[/code]

여튼 제가 추측하기엔 int& 인 경우 30이란 숫자를 넣을 때, 함수 안에서 값을 바꾸는 경우 30이란 상수를 바꾸게 되는 경우가 있으므로 아예 거부하지만,
const int&인 경우는 그런 경우를 생각하지 않아도 되니 그냥 받아들이는 모양이네요.


[code]
T &        <= const T    // Error
const T &  <= const T    // OK
[/code]


정말 C++ 하면서 자꾸 느끼는 거지만, C++에서 말하는 const 키워드는 기능이 상당히 많은 것 같습니다...