programing

'const'한정자로 정적 멤버 함수를 만들 수없는 이유

nasanasas 2020. 10. 12. 07:36
반응형

'const'한정자로 정적 멤버 함수를 만들 수없는 이유


오늘 문제가 생겼습니다. static멤버 함수 가 필요 const합니다. 필수가 아니라 더 좋습니다. 그러나 나는 노력에 성공하지 못했습니다. 아무도 왜 또는 어떻게 말할 수 있습니까?


const비 정적 멤버 함수에 한정자를 적용 하면 this포인터에 영향을줍니다 . class의 const 정규화 된 멤버 함수의 C경우 this포인터는 형식 C const*이고 const 정규화되지 않은 멤버 함수의 경우 this포인터 형식은입니다 C*.

정적 멤버 함수에는 this포인터 가 없으므로 (이러한 함수는 클래스의 특정 인스턴스에서 호출되지 않음) 정적 멤버 함수의 const 한정은 의미가 없습니다.


나는 귀하의 질문에 동의하지만 불행히도 C ++는 그렇게 설계되었습니다. 예를 들면 :

class A {
  int i;         //<--- accessed with 'this'
  static int s;  //<---- accessed without 'this'
public:
  static void foo ()  const // <-- imaginary const
  {}
};

오늘 const부터는 this. 어떤면에서는 좁습니다. 이것을 포인터 const너머로 적용하면 더 넓게 만들 수 있습니다 this.
즉, 기능 const에도 적용될 수 있는 "제안 된" staticstatic회원의 수정을 제한합니다 .

예제 코드에서 foo()만들 수있는 경우 const해당 함수에서 A::s수정할 수 없습니다. 이 규칙이 표준에 추가되면 언어 부작용을 볼 수 없습니다. 오히려 그러한 규칙이 존재하지 않는 것이 재미 있습니다!


세부 사항을 다루지 않고 함수에 의해 수정 된 객체가있을 수도 있고 없을 수도 있기 때문에 const는 컴파일러에 대해 모호합니다.

리콜 const유지 상수 객체 만, 또는 일정하게 유지하기 위해 여기 객체가 될 수도 있고 그렇지 않을 수도 있습니다.


C ++가 설계에 따라이를 받아들이지 않는 것은 유감이지만 논리적으로 잘 검증되는 사용 사례가 거의 없습니다.

클래스 수준 유효 (정적) 인 함수는 정적 데이터를 변경하지 않을 수 있습니다. 쿼리 데이터는 const 여야합니다. 다음과 같아야 할 수도 있습니다.

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios

'상수 멤버 함수'는 호출 된 개체를 수정할 수 없지만 정적 멤버 함수는 어떤 개체에서도 호출되지 않습니다. 범위 해결 연산자가 직접 사용합니다. 따라서 const 정적 멤버 함수를 갖는 것은 의미가 없으므로 불법입니다.

참고 URL : https://stackoverflow.com/questions/7035356/c-why-static-member-function-cant-be-created-with-const-qualifier

반응형