2010-02-23 2 views
9

아무에게도이 두 문장의 차이점이 무엇인지 설명 할 수 있습니까?C++에서 참조 초기화

class A{}; 

const A& a = A();   // correct 

A& b = A();    // wrong 

그것은 유형 A

의 임시의 유형 A&의 const가 아닌 참조 잘못된 초기화가 왜 여기에 문제가 const를 난데?

답변

14

비 const 참조는 l 값으로 초기화해야합니다. 임시 직원으로 초기화 할 수 있다면 다음과 같은 일을 할 수 있습니까?

int& foo = 5; 
foo = 6; // ?! 

const 참조들은 심판의 수명을 연장 특별한 속성을 가지고 있고, 그들이 const을하기 때문에, 메모리에 앉아 있지 않는 무언가를 수정하려고합니다 가능성은 없다. 예를 들어 :

const int& foo = 5; 
foo = 6; // not allowed, because foo is const. 

는 참조가 실제로 뭔가뿐만 아니라 임시 변수를 참조 할 필요가 있음을 기억하십시오. 예를 들어 다음 내용이 유효합니다.

int foo = 5; 
int& bar = foo; 
bar = 6; 
assert(foo == 6); 
+1

잠깐, 그렇다면'const classA & ref = ReturnsClassAByValue();'를 사용할 수 있다는 뜻입니까? 온도가 다음 줄에서 사라질 것이라고 생각했습니다. – Lucas

+2

예, 사용할 수 있습니다. 임시 변수는 참조 변수가있는 한 지속됩니다. http://herbsutter.spaces.live.com/blog/cns!2D4327CC297151BB!378.entry –

+1

감사합니다. 그럼, 매일 새로운 것을 배웁니다. – Lucas

1

임시/추측 값의 경우 const 참조 만 가질 수 있습니다.

비 임시/좌측 값에 대한 const가 아닌 참조를 가질 수 있습니다.

A a; 
A& b = a; 

나는 이유는 왜 잠시 사라질 것입니다 무언가를 수정할 수있는 거의 값이 같은를 rvalue가 일시적이라는 사실을 강화하는 것입니다 생각합니다.

+1

허가 됨; 나는 OP가 그것이 왜 그런지를 찾고 있다고 생각한다. – fbrereto

1

C++ 언어에서는 rvalue에 const가 아닌 참조를 첨부하는 것은 허용되지 않지만 rvalue에 const 참조를 첨부해도 무방합니다. 위의 규칙이뿐만 아니라 귀하의 경우에 적용하므로이,

int &r = 5; // ERROR 

표현 A()에 의해 반환 유형 A의 임시 객체가를 rvalue입니다하지 않습니다 예를 들어,이

const int& r = 5; 

합법적이다.

+0

rvalue는 함수의 반환 값과 같이 이름이없는 임시 값입니다. – thebretness

+0

@thebretness : 반드시 그런 것은 아닙니다. 예를 들어 enum 상수는 rvalue이지만 * named *입니다. – AnT

3

이 용어는 다소 혼란 스럽습니다. 조금 더 연구하면 좋을 것입니다. 여기에 짧은 대답은 :

임시 개체 (클래스의 생성자를 호출 한 결과)를 변수에 할당하려고합니다. 임시 객체는 R 값입니다. 비 const 참조에 R 값을 할당 할 수 없습니다.

R 값을 const 참조에 지정할 수는 있지만, 허용하기위한 근거가 꽤 명확하지 않습니다.

0

표준 그렇게 말한다 때문에 :

§8.5.3.5이 ... 그렇지 않으면, 참조가 비 휘발성 CONST 타입 좌변 참조한다 ...

#include <iostream> 
int main() 
{ 
    const int & cr=5; 
    int & r=const_cast<int &>(cr); 
    r=6; 
    std::cout<<r; 
} 
// outputs 6 with c++/clang++, Debian 8, amd64 

을하지만 가정 일정 CR도 더 이상에서 const되지 않는다는 것을 알고, 당신은 정의되지 않은 동작이 발생할 :

그러나, 당신이 아주 많이 원한다면, 당신은 그것을 얻을 수 있습니다. (§1.9 (4))

위 코드에서 제안한 바와 같이 기술적 인 이유는 없습니다. 오히려 디자이너는 임시 사용자에 대한 비 const 참조를 통해 사용자가 수행 할 작업에 대해 악몽을 꾼다.

관련 문제