Development Tip

상수 참조 란 무엇입니까?

yourdevel 2020. 12. 6. 22:11
반응형

상수 참조 란 무엇입니까? (상수에 대한 참조가 아님)


꽤 이론적 인 질문 ... 왜 상수 참조가 상수 포인터와 같은 방식으로 작동하지 않고 실제로 가리키는 객체를 변경할 수 있습니까? 그들은 정말로 또 다른 평범한 변수 선언처럼 보입니다. 왜 내가 그것들을 사용합니까? 다음은 오류없이 컴파일 및 실행되는 간단한 예제입니다.

int main (){
    int i=0;
    int y=1;    
    int&const icr=i;
    icr=y;          // Can change the object it is pointing to so it's not like a const pointer...
    icr=99;         // Can assign another value but the value is not assigned to y...
    int x=9;
    icr=x;
    cout<<"icr: "<<icr<<", y:"<<y<<endl; 
}

가장 명확한 대답. "X & const x"가 의미가 있습니까?

아니, 말도 안돼

위의 선언이 의미하는 바를 알아 보려면 오른쪽에서 왼쪽으로 읽으십시오. "x는 X에 대한 const 참조입니다". 그러나 이것은 중복입니다. 참조는 항상 const입니다. 참조를 다시 배치하여 다른 객체를 참조하도록 만들 수는 없습니다. 못. const 유무에 관계없이.

즉, "X & const x"는 기능적으로 "X & x"와 동일합니다. & 뒤에 const를 추가하여 아무것도 얻지 못하므로 추가해서는 안됩니다. 사람들을 혼란스럽게 할 것입니다. const는 마치 "const X & x"라고 말한 것처럼 X가 const라고 생각하게 만들 것입니다.


이 진술 icr=y;은 참조가 참조하도록하지 않습니다 y. yicr참조 하는 변수에 의 값을 할당합니다 i.

참조는 본질적으로 const이므로 참조하는 내용을 변경할 수 없습니다. const실제로 ' 참조'인 ' 참조' const가 있습니다. 즉, 참조하는 객체의 값을 변경할 수 없습니다. 그들은 선언 const int&되거나 int const&오히려 선언 int& const됩니다.


어떤 일정한 기준 (아닌 상수 참조)이다 일정한 기준이 사실 인 상수에 대한 참조 .

상수 참조 / 상수 참조는 다음과 같이 표시됩니다.

int const &i = j; //or Alternatively
const int &i = j;
i = 1;            //Compilation Error

이는 기본적으로 참조가 참조하는 유형 객체의 값을 수정할 수 없음을 의미합니다.
예 : const 참조를 통해 변수의
값을 수정 (assign 1) 하려고하면 오류가 발생합니다.ji

읽기 전용 참조 'i'할당


icr=y;          // Can change the object it is pointing to so it's not like a const pointer...
icr=99;

참조를 변경하지 않고 참조가 참조 하는 유형의 값을 할당 합니다. 초기화시 바인딩 된 변수 이외의 다른 변수를 참조하도록 참조 할 수 없습니다.

첫 번째 문 은 값 할당합니다 . 두 번째 문 은 값 할당합니다 .yi
99i


"상수 참조"란 "상수 데이터에 대한 참조"를 의미한다고 생각합니다. 반면에 포인터는 상수 포인터 (포인터 자체가 가리키는 데이터가 아니라 상수 임), 상수 데이터에 대한 포인터 또는 둘 다일 수 있습니다.


이 코드는 형식이 잘못되었습니다.

int&const icr=i;

참조 : C ++ 17 [dcl.ref] / 1 :

cv 한정자가 typedef-name 또는 decltype-specifier를 사용하여 도입되는 경우를 제외하고 Cv 한정 참조는 형식이 잘못 되었습니다.이 경우 cv 한정자는 무시됩니다.

이 규칙은 모든 표준화 된 버전의 C ++에 존재했습니다. 코드의 형식이 잘못 되었기 때문에 :

  • 당신은 그것을 사용해서는 안되며
  • 연관된 동작이 없습니다.

컴파일러는 프로그램을 거부해야합니다. 그렇지 않은 경우 실행 파일의 동작은 완전히 정의되지 않습니다.

NB : 다른 답변이 아직 이것을 언급하지 않았는지 확실하지 않습니다 ... 아무도 컴파일러에 액세스 할 수 없습니까?


다른 답변에서 언급했듯이 참조는 본질적으로 const입니다.

int &ref = obj;

객체로 참조를 초기화 한 후에는 참조하는 객체로이 참조의 바인딩을 해제 할 수 없습니다. 참조는 별칭처럼 작동합니다.

const참조 를 선언 하면 const 객체를 참조하는 참조 일뿐입니다.

const int &ref = obj;

상기와 같은 선언적 문장 constint참조에 의해 참조 될 객체의 가능한 기능을 판정한다. 좀 더 명확하게 말해서 참조에 pointer해당하는 것을 보여 드리고자합니다 const.

const int *const ptr = &obj;

So the above line of code is equivalent to a const reference in its working way. Additionally, there is a one last point which I want to mention;

A reference must be initialized only with an object

So when you do this, you are going to get an error;

int  &r = 0; // Error: a nonconst reference cannot be initialized to a literal

This rule has one exception. If the reference is declared as const, then you can initialize it with literals as well;

const int  &r = 0; // a valid approach

First I think int&const icr=i; is just int& icr = i, Modifier 'const' makes no sense(It just means you cannot make the reference refer to other variable).

const int x = 10;
// int& const y = x; // Compiler error here

Second, constant reference just means you cannot change the value of variable through reference.

const int x = 10;
const int& y = x;
//y = 20; // Compiler error here

Third, Constant references can bind right-value. Compiler will create a temp variable to bind the reference.

float x = 10;
const int& y = x;
const int& z = y + 10;
cout << (long long)&x << endl; //print 348791766212
cout << (long long)&y << endl; //print 348791766276
cout << (long long)&z << endl; //print 348791766340

참고URL : https://stackoverflow.com/questions/7420780/what-is-a-constant-reference-not-a-reference-to-a-constant

반응형