왜`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);
사용자가 지정한 그래서 T
A는 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);
다음 T
것 int
, 그리고 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
'your programing' 카테고리의 다른 글
Visual Studio 데이터베이스 프로젝트 * .refactorlog 파일이 소스 제어에 속합니까? (0) | 2020.12.25 |
---|---|
사용되지 않는 std :: iterator 준비 (0) | 2020.12.25 |
Mercurial 클론에서 작업 복사본을 제거하려면 어떻게해야합니까? (0) | 2020.12.25 |
@dynamic은 Objective-C에서 무엇을합니까? (0) | 2020.12.25 |
자바 스크립트 데이터 구조 라이브러리 (0) | 2020.12.25 |