2011-08-06 2 views
11

누군가이 오류를 시뮬레이트하는 방법을 설명해 주시겠습니까? 또한 이것이 무엇에 대해 불평하는지.const가 아닌 참조는 lvalue에만 바인딩 될 수 있습니다.

void foo(int &x) { ... } 
int bar()  { ... } 

foo(bar()); 

당신은해야합니다 :

그것은 당신이 뭔가를 할 수 없음을 의미

+2

'비 const 참조', '경계'또는 '좌측 값'중 어느 용어를 이해하지 못합니까? – john

+1

@Seth :이 오류를주는 몇 가지 코드를 묻는 질문입니다. 질문자는 당신의 요구를 만족시킬 수 없습니다. –

+0

@ 스티브 그래, 내 눈이 _simulate_라는 단어를 놓쳤다. –

답변

41

왼쪽의 값은 대략적으로 할당 문 왼쪽에 표시 될 수 있습니다. 참고 다른 개체에 대한 별칭을 제공

std::string s; 
std::string & rs = s; // a non-const reference to s 
std::string const & crs = s; // a const reference to s 

은 위의 정의를 감안할 때 rs 또는 crs 참조가 const를 그대로 당신이 crs를 통해 언급 된 문자열을 수정할 수 없습니다 것을 제외하고, s 참조와 동일합니다. 변수는 lvalue이므로 const가 아닌 참조를 바인딩 할 수 있습니다. 반면에 당신은 같이 임시 값에 const를 참조를 바인딩 할 수 있습니다 :

std::string const & crs1 = std::string(); 

을 다음과 불법 그러나 :

std::string & rs1 = std::string(); 

당신은 당신이 참조 된 수정할 것을 의미 const가 아닌 참조를 사용하기 때문에 목적. 그러나 참조가 범위를 벗어날 때 참조에 바인딩 된 임시 변수는 소멸됩니다. C++이 임시 객체를 생성 할 때 항상 직관적 인 것은 아니기 때문에 비 const 참조에 바인드 할 수 없으므로 원하는대로 객체를 변경하는 불편한 놀라움을 피할 수 있습니다.

+0

+1 우수 사례 –

+0

@ 니콜라, 여기 하나의 질문입니다. int method1 (int & a); – Pavan

+0

그렇습니다. 직접적인 결과는 정수 리터럴을 인수로 전달하는이 함수를 호출 할 수 없다는 것입니다. –

5

C++에서 "A const가 아닌 참조 만 좌변에 결합 할 수있다" fooconst 참조로 가져 오거나 bar()의 결과를 변수에 할당 한 다음 foo으로 전달하십시오.

관련 문제