const 및 non-const와 동일한 객체입니다. 올바르게 작동하려면 어떻게 가정해야 합니까?
-
20-12-2019 - |
문제
나는 형식의 기능을 가지고있다.
return_type function(const argument_type & a, argument_type & b);
동일한 객체가 전달되는 경우 a
그리고 b
, 기능을 계속 진행하거나(잠재적으로 수정할 수 있음) 중단할 수 있나요?
나는 그 경우에 컴파일러 가정이 어떻게 전파되는지에 대한 지식이 없습니다.
내 생각에 그것은 non-const로 전달되는 것에 대한 non-constness 가정입니다. b
충분하고 수정을 허용해야 하지만 이는 추측일 뿐입니다.
대부분의 답변은 존재에 관한 것이었습니다. 할 수 있는 수정하다 a
또는 b
, 또는 const가 아닌 메소드를 호출하십시오.나는 둘 다와 동일한 객체를 전달하면 const
그리고 non-const
나는 그걸 할 수있어.내 의심은 함수가 반환될 때 프로그램을 떠날 것이라는 것과 그것이 일부 컴파일러 가정을 깨뜨릴 수 있는지에 더 가깝습니다. 예를 들면 다음과 같습니다.
class A(){
int value;
}
void function1(const A & arg1);
void function2(A & arg1);
void function3(const A & arg1, A & arg2);
A a;
a.value=5;
function1(a);
if(a.value==5){/*...*/;} // the if can be optimized out to true, because [a] was const
a.value=5;
function2(a);
if(a.value==5){/*...*/;} //must be checked, [a] could have been modified
a.value=5;
function3(a, a);
if(a.value==5){/*...*/;} // ???
내가 찾은 가장 유사한 질문(실제로는 그렇지 않음)
해결책
문제는
return_type function(const argument_type & a, argument_type & b);
그리고 전화 function( o , o )
그 기능은 아마도
형식적 인수를 통해 객체를 수정합니다.
b
, 하는 동안동시에 공식적인 논쟁을 기대함
a
변함없이 유지되도록.
따라서 아마도 함수의 가정을 깨뜨려 결과적으로 다음과 같은 결과가 나올 것입니다.잘못된 결과 또는 충돌.
그 기능이 하나 있는데 디자인에 의해 종종 이런 종류의 서명, 즉 복사 할당 연산자가 있습니다.끊임없는 형식적 주장 a
는 명시적으로 제공된 인수이고 변경 가능한 형식 인수(라고 부를 수 있는 경우)는 암시적입니다. *this
.자체 참조(인수 별칭)를 확인하거나 복사 및 교환할 수 있습니다.
요약하자면, 인수와 동일한 객체를 사용하여 함수를 안전하게 호출할 수 있는지 여부 a
그리고 인수로 b
함수에 따라 다르지만 형식 인수가 다른 개체를 참조한다는 암시적 전제 조건이 있다는 함수의 가정을 위반할 가능성이 있습니다.
다른 팁
해당 함수가 두 번 주어진 것과 동일한 인수로 호출 될 수 있는지 여부를 결정합니다.
어쨌든, 알고리즘의 정확성이 의존하지 않거나 보증을주지 않는 한 동일한 개체를 두 번 가져 오는지 여부를 확인하려고 노력해서는 안됩니다.
런타임에 정확히 동일한 방식으로 정확히 동일한 방법으로 정확하게 전달됩니다.
const
와의 차이는 컴파일 시간에서만 발생합니다.컴파일러는 const
메서드 만 호출 하고이 const
객체의 속성을 수정하지 않도록 하려는지 확인합니다. 그렇지 않으면 컴파일 오류가 발생하지 않으므로
내 생각에는 non-const b로 전달되는 것에 대한 non-constness 가정으로 충분하고 수정이 허용되어야 하지만 이는 추측일 뿐입니다.
예, function
비번으로 전화할 수 있습니다.const
방법을 통해 b
하지만 경유하지 않음 a
.
직관적으로 이것은 다음을 의미합니다. function
를 통해 전달된 객체를 변경할 수 있습니다. const
참조 a
동일한 객체가 비-객체를 통해서도 전달되는 경우const
참조 b
.
일반적으로, const
단지 당신이 할 수 있는 것과 할 수 없는 것에 대해서만 보증합니다. const
변하기 쉬운.을 참조하는 다른 변수가 있을 수 있습니다. const
변수 또는 그 안에 있는 개체에 const
변수를 수정하는 것처럼 보이지 않는 함수에 의해 수정될 변수 const
변하기 쉬운.
귀하의 사례로 돌아가서, 귀하보다 더 높은 수준의 함수와 클래스에 달려 있습니다. function
다음을 사용하여 수정할 수 있는 것과 수정될 수 없는 것에 대한 제약 조건을 스스로 시행합니다. const
매개변수, 멤버 함수 등