아무에게도이 두 문장의 차이점이 무엇인지 설명 할 수 있습니까?C++에서 참조 초기화
class A{};
const A& a = A(); // correct
A& b = A(); // wrong
그것은 유형 A
의 임시의 유형 A&
의 const가 아닌 참조 잘못된 초기화가 왜 여기에 문제가 const
를 난데?
아무에게도이 두 문장의 차이점이 무엇인지 설명 할 수 있습니까?C++에서 참조 초기화
class A{};
const A& a = A(); // correct
A& b = A(); // wrong
그것은 유형 A
의 임시의 유형 A&
의 const가 아닌 참조 잘못된 초기화가 왜 여기에 문제가 const
를 난데?
비 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);
임시/추측 값의 경우 const 참조 만 가질 수 있습니다.
비 임시/좌측 값에 대한 const가 아닌 참조를 가질 수 있습니다.
A a;
A& b = a;
나는 이유는 왜 잠시 사라질 것입니다 무언가를 수정할 수있는 거의 값이 같은를 rvalue가 일시적이라는 사실을 강화하는 것입니다 생각합니다.
허가 됨; 나는 OP가 그것이 왜 그런지를 찾고 있다고 생각한다. – fbrereto
C++ 언어에서는 rvalue에 const가 아닌 참조를 첨부하는 것은 허용되지 않지만 rvalue에 const 참조를 첨부해도 무방합니다. 위의 규칙이뿐만 아니라 귀하의 경우에 적용하므로이,
int &r = 5; // ERROR
표현 A()
에 의해 반환 유형 A
의 임시 객체가를 rvalue입니다하지 않습니다 예를 들어,이
const int& r = 5;
합법적이다.
rvalue는 함수의 반환 값과 같이 이름이없는 임시 값입니다. – thebretness
@thebretness : 반드시 그런 것은 아닙니다. 예를 들어 enum 상수는 rvalue이지만 * named *입니다. – AnT
이 용어는 다소 혼란 스럽습니다. 조금 더 연구하면 좋을 것입니다. 여기에 짧은 대답은 :
임시 개체 (클래스의 생성자를 호출 한 결과)를 변수에 할당하려고합니다. 임시 객체는 R 값입니다. 비 const 참조에 R 값을 할당 할 수 없습니다.
R 값을 const 참조에 지정할 수는 있지만, 허용하기위한 근거가 꽤 명확하지 않습니다.
표준 그렇게 말한다 때문에 :
§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 참조를 통해 사용자가 수행 할 작업에 대해 악몽을 꾼다.
잠깐, 그렇다면'const classA & ref = ReturnsClassAByValue();'를 사용할 수 있다는 뜻입니까? 온도가 다음 줄에서 사라질 것이라고 생각했습니다. – Lucas
예, 사용할 수 있습니다. 임시 변수는 참조 변수가있는 한 지속됩니다. http://herbsutter.spaces.live.com/blog/cns!2D4327CC297151BB!378.entry –
감사합니다. 그럼, 매일 새로운 것을 배웁니다. – Lucas