문제

C ++에서는 스택-할당 된 물체를 선언 할 수 있습니다 const:

const Class object;

그 후에 그러한 객체에 대한 비 초가 방법을 호출하려는 시도는 정의되지 않은 동작입니다.

const_cast<Class*>( &object )->NonConstMethod(); //UB

힙 할당 된 물체가 될 수 있습니다 const 같은 결과로? 다음은 다음과 같습니다.

const Class* object = new Class();
const_cast<Class*>( object )->NonConstMethod(); // can this be UB?

또한 정의되지 않은 행동입니까?

도움이 되었습니까?

해결책

예. 구성하고 파괴하는 것은 합법적입니다 const 힙 물체. 다른 것과 마찬가지로 const 물체, 비가 아닌 것으로 조작 한 결과const 물체 (예 : a const_cast 포인터 또는 참조)의 정의되지 않은 동작을 유발합니다.

struct C
{
        C();
        ~C();
};

int main()
{
        const C* const p = new const C;

        C* const q = const_cast<C*>(p); // OK, but writes through q cause UB

        // ...

        delete p; // valid, it doesn't matter that p and *p are const

        return 0;
}

다른 팁

힙 예에서 new 포인터를 사용하지 않는 것으로 반환합니다. Const에 대한 포인터에 저장했다는 사실 (그리고 그런 다음 const_casted는 객체 자체가 스택에 합당한 것과 같은 방식으로 객체 자체가 const가 아니라는 사실을 바꾸지 않습니다.

그러나 당신은 ~할 수 있다 힙에 const 객체를 만듭니다.

const Class* object = new const Class();

그러한 경우, 비 정통에 대한 포인터로 캐스팅하고 비 초가 방법을 호출하는 것은 Const 스택 할당 객체와 같은 상황이 될 것입니다.

(힙에 const 객체를 만드는 아이디어는 나에게 새로운 것이 었습니다. 나는 전에 그것을 본 적이 없었습니다. Charles Bailey 덕분에.)

예, 힙 할당 된 물체는 const 일 수 있습니다. 7.1.5.1/5의 예제에서 발췌 한 내용을 고려하십시오.

const int* ciq = new const int (3);    // initialized as required
int* iq = const_cast<int*>(ciq);       // cast required
*iq = 4;                               // undefined: modifies a const object

질문에 준 예는 묻지 않기 때문에 괜찮습니다. new const 객체를 만들기 위해; 당신은 결과를 포인터간에 저장하고 있습니다.

잊지 마세요 변하기 쉬운 회원

비 컨택 메드가 만 수정하는 경우에는 피해한 동작이 아닙니다. mutable Const 자격을 갖춘 클래스의 자격을 갖춘 회원 (7.1.5.1 (4) 참조). 그렇지 않으면 정의되지 않은 행동입니다.

const A* p = new(const A);
A *q = const_cast<A*>(p);
q->NonConstMethodThatModifiesMembers();             // undefined behaviour!
q->NonConstMethodThatOnlyModifiesMutableMembers();  // defined behaviour!

확실히:

struct Foo {
  const int Bar;
  Foo() : Bar(42) { }
};

Foo* foo = new Foo;
const_cast<int&>(foo->Bar); // don't do this.

Const_cast는 객체가 실제로 읽기 전용 일 때 UB를 유발할 수 있습니다 (예 : 컴파일러는 코드에서 하드 코드 된 문자열을 사용할 때 어떤 이유로 읽기 만하면 특정 메모리 영역에 배치하여 CODILER가 해당 객체를 생성 할 수 있습니다). 이것은 참조를 유지하는 방법에 관계없이 힙 할당 된 객체에서는 발생하지 않습니다 (Const Pointer, Const Reference 등).

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