편집 : 나는 몇 가지를 실험하고 생각보다 조금 미묘한 것을 발견했습니다. 내가 지금 생각하는 것이 정답입니다.
&s
는 lvalue가 아니므로 참조 유형이에 대한 참조가 아니면 참조를 작성할 수 없습니다 const
. 예를 들어, 당신은 할 수 없습니다
string * &r = &s;
하지만 넌 할 수있어
string * const &r = &s;
함수 헤더에 비슷한 선언을 넣으면 작동합니다.
void myfunc(string * const &a) { ... }
또 다른 문제, 즉 임시 문제가 있습니다. 규칙은 임시 인 경우에만 참조를 얻을 수 있다는 것입니다 const
. 따라서이 경우 & s는 일시적이라고 선언 할 수 있으므로 선언해야합니다.const
함수 프로토 타입에서 . 실제적인 관점에서이 경우에는 차이가 없습니다. (rvalue 또는 임시입니다. 어느 쪽이든 같은 규칙이 적용됩니다.) 그러나 엄밀히 말하면, 나는 그것이 일시적이 아니라 rvalue라고 생각합니다. 두 가지를 구별 할 수있는 방법이 있는지 궁금합니다. (아마도 모든 임시는 rvalue이고, 비 lvalue는 임시 인 것으로 정의되어 있습니다. 저는 표준 전문가가 아닙니다.)
즉, 귀하의 문제는 아마도 더 높은 수준 일 것입니다. 의 주소에 대한 참조를 원하는 이유는 무엇 s
입니까? 에 대한 포인터를 참조하려면 다음과 같이 포인터 s
를 정의해야합니다.
string *p = &s;
myfunc(p);
에 대한 참조 s
또는 포인터를 원하면 s
간단한 작업을 수행하십시오.
string* const& val
와 같이 덜 읽기 쉬운 대신에 No.2의 방식을 작성하는 것이 특히 유익합니다const string* &val
. 내 눈에 이것은 분명히 const 참조 , 포인터, 문자열에 대한 것입니다. 나는 이 정확한 설명을 얻기 위해 선언T const&
대신 글을 쓰는 것을 선호합니다const T&
.