const 및 non-const와 동일한 객체입니다. 올바르게 작동하려면 어떻게 가정해야 합니까?

StackOverflow https://stackoverflow.com//questions/23001360

문제

나는 형식의 기능을 가지고있다.

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){/*...*/;} // ??? 

내가 찾은 가장 유사한 질문(실제로는 그렇지 않음)

self에 대한 non const 포인터를 통해 const 메소드 내에서 self 수정

도움이 되었습니까?

해결책

문제는

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 매개변수, 멤버 함수 등

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top