비 const 멤버 함수 (const를) 참조 멤버 변수를 전달할 때 : (경고없이, 그냥 질문 상승 오류로 실행
- 내가 경고 컴파일러를 얻을 안을 MSVC2013을) 또는
- 내가 따라야 할 새로운 가이드 라인을 알아야합니까, 아니면
- 나는 완전히 바보 같은 짓을하고 있습니까?
저는 멤버 함수 내에 있고 다른 멤버 함수에 const&
매개 변수로 멤버 변수를 전달합니다. 호출 된 함수는 const
이 아닙니다. 나는 그것에 대해 생각한다면, 나는 단지 그렇게해서는 안된다는 것을 확신합니다.
우연히 원래 전달 된 멤버 변수를 수정할 때 const&
매개 변수가 마술처럼 변경 될 수 있습니다. 에, 허용되지 않습니다, 선언되지 않고 const
. 코드에서
예 :
struct S
{
void caller()
{
called_one(this->memvar);
}
void called_one(const int& x)
{
// ...
this->memvar = 2; // changes x! That's surprising... at least for this function
// ...
}
private:
int memvar{};
}
나는 실수로 다시 오류로 실행되지 좋을 것이다 생각합니다. 아마도 언어 나 컴파일러가이를 방지하는 것이 가장 쉬운 작업이 아닌가? 일부 인기있는 가이드 라인에서 아직 그 문제를 발견하지 못했습니다.
UPDATE :
은 아마도 내가 행동이 이상한 찾을 수없는 것을 명확히해야한다. 앨리어싱 된 변수가 왜 달라 지는지 궁금하지 않습니다. 뭔가 잘못하고,... 그리고 caller
인 하나
UPDATE)에 대한 답변은 단지 called_one
자신, 이상한 발견 할 기능에 초점을 맞춘 경우 그것은 좋은 것입니다. 하지만 그는 (코드를 읽음으로써) 그 사실을 깨달을 수있는 공정한 기회가 있다고 생각합니다. 그는 호출 된 함수가 매개 변수를 통하지 않고 수정할 수도 있다는 것을 알기 위해 별칭을 전달합니다. 그러면 호출 된 함수 내에서 예기치 않은 동작이 발생할 수 있습니다.
그래서이 특별한 경우에도 컴파일러가 도움이되지 않거나 합리적이지 않은 경우 가이드 라인의 형태로 그 함정을 소개하는 것이 왜 가치가 없거나 유용하지 않은지 나는 알지 못합니다.
당신은'수정할 수 없습니다
const_cast
를 사용하여int&
로 다시 전송할 수 있습니다 x'이지만, 'this-> memvar'는'const'로 표시되지 않고 둘 다 함수 자체가 아닙니다. 그래서 마지막 대안, 바보 같은 일을하는 것은 일어나는 일입니다. :) –_ 나는 그것에 대해 생각할 때, 나는 그저 그렇게하지 말아야한다고 확신한다. 글쎄, 할 수있어. 당신의 추론이 잘못되었습니다. 그게 다야. – skypjack
'memvar'는 const가 아니므로 모든 것이 excepted로 동작합니다. 'x'는'const int &'이므로'x'를 통해'memvar'를 수정할 수 없습니다. – Asu