your programing

왜`const T &`가 const가 아닐까요?

lovepro 2020. 12. 25. 23:34
반응형

왜`const T &`가 const가 아닐까요?


template<typename T>
void f(T a, const T& b)
{
    ++a; // ok
    ++b; // also ok!
}

template<typename T>
void g(T n)
{
    f<T>(n, n);
}

int main()
{
    int n{};
    g<int&>(n);
}

참고 : b입니다 const T&++b괜찮습니다!

const T&const 확실하지 않은 이유는 무엇 입니까?


const 및 참조 축소에 오신 것을 환영합니다 . 당신이있을 때 const T&, 기준이 적용됩니다 T, 그래서 않습니다 const. 당신 g

g<int&>(n);

사용자가 지정한 그래서 TA는 int&. 우리는 좌변 참조에 대한 참조를 적용하면 두 개의 참조 때문에, 하나 하나 붕괴 int& &단지가된다 int&. 그런 다음 [dcl.ref] / 1 에서 규칙을 얻습니다.이 규칙은 const참조에 적용 하면 폐기되므로 다음 int& const과 같이됩니다 int&(실제로 선언 할 수 없음 int& const, typedef 또는 템플릿에서 가져와야 함). ).

g<int&>(n);

당신은 실제로 전화하고 있습니다

void f(int& a, int& b)

실제로 상수를 수정하는 것이 아닙니다.


당신 g

g<int>(n);
// or just
g(n);

다음 Tint, 그리고 f으로 밖으로 각인되었을 것이다

void f(int a, const int& b)

때문에 T더 이상 참조되지는 const과가 &적용된 얻을, 당신은 일정한 변수를 수정하려고에 대한 컴파일러 오류가 발생했을 것입니다.


나는 이미 받아 들여진 대답이 있다는 것을 알고 있지만 템플릿 영역 외부와 일반적으로 함수 선언에서도 약간 추가하기 만하면됩니다 ...

( const T& ) 

다음과 같지 않다

( const T )

첫 번째와 일치하는 예제에는 const 참조가 있습니다. 수정할 수없는 const 값을 진정으로 원한다면 두 번째 예제에서와 같이 참조를 제거하십시오.

참조 URL : https://stackoverflow.com/questions/54480599/why-is-const-t-not-sure-to-be-const

반응형