2016-11-26 1 views
1

오늘 코드에서 "실수"를 발견했습니다 ... "실수"로 인해 실제로 컴파일 된 코드가 변경되는지 확실하지 않습니다.참조 변수의 C++ 초기화

double, x에 대한 다음 참조의 초기화를 고려하십시오.

double &x{*_data->x_double}; // x_double is a member variable of the struct 
          // _data, it is a pointer to another double 

// eg, I have this somewhere else... 
struct data 
{ 
    double *x_double; 
}; 

data *_data = new data; // edit: duh, this has to be a pointer... 

double another_x = 10.0; 
_data->x_double = &another_x; // edit: pointer here too! 

그러나 나는하지 않는 한 다음 "실수"... (추가 = 기호를 통지)

double &x={*_data->x_double}; 

이 코드는 내 실제 코드에서 복사 최소한의 예입니다을했다 doubles에 대한 참조가 있지만 std::vector과 같은 큰 객체에 대한 참조가 있습니다.

참조 변수는 알고리즘에서 사용되며 변수 이름은 매우입니다. 따라서 참조를 사용하여 해당 변수의 단락 별명을 만듭니다. 왜 내가 그랬는지 이해가 되었으면 좋겠다. ...

그래서 "실수"를 "수정"했지만 출력 결과는 실제로 변경되었다.

+0

[참조 초기화] (http://en.cppreference.com/w/cpp/language/reference_initialization)의 규칙을 살펴보십시오. – NathanOliver

+0

@GillBates 그래서 출력 코드는 동일합니다. 맞습니까? – user3728501

+0

@ user3728501 예,이 경우입니다. –

답변

0

둘 다 list initialization입니다. 귀하의 경우에 :

double &x={*_data->x_double}; 

은 다음과 같습니다

6) 서명과 일치 한 후 보강-초기화 목록에 명명 된 변수의 초기화

그리고

double &x{*_data->x_double}; 

:

보강-초기화 목록에 명명 된 변수 (1) 초기화 는 표현의 비어 중괄호로 둘러싸인 목록 또는 중첩 보강-INIT-목록)

이들의 효과입니다 이 경우 정확하게 동일합니다.