IT TIP

& x 대신 addressof (x)를 사용하는 경우

itqueen 2020. 12. 11. 21:09
반응형

& x 대신 addressof (x)를 사용하는 경우


개체의 주소를 가져올 때 addressof(x)대신 필요한지 여부를 어떻게 결정 &x합니까?


질문이 혼란스러워 보이므로 설명이 순서대로 진행됩니다.

addressof분명히 오버로드 된 연산자 주소를 우회합니다. 나는 이미 알고 있습니다.

내가 알고 싶은 것은 :
그것이 내가 정말로하고 싶은 일인지 어떻게 알 수 있습니까? (특히 템플릿 내부에있을 때 등)

addressof대신 필요한시기를 파악하는 데 도움이되는 일종의 "규칙"이 &있습니까?
결국 둘 다 객체의 "주소"를 반환하므로 언제 어떤 것을 사용해야합니까?


std::addressof필요할 때 사용 합니다. 안타깝게도 "필요할 때"에는 템플릿 코드에서 작업하고 알 수없는 유형의 변수를 변경 T하거나 T&해당 변수의 메모리에 대한 신에게 정직한 포인터로 바꾸려는 경우가 포함됩니다.

C ++위원회가 어리석게도 참조 연산자의 오버로딩을 허용했기 때문에 (적법한 목적이 거의 없음) 사용자가 참조 연산자를 사용하여 실제 포인터를 가져올 수없는 일부 유형으로 템플릿을 인스턴스화 할 수 있습니다. std::addressof이 모호한 C ++ 기능을 사용하는 사용자를 해결하여 언어가 처음부터 작동하도록 보장해야하는 작업을 수행하는 방법입니다.

요컨대, 언어 어리 석음에 대한 라이브러리 수정입니다. &사용자가 코드를 깰 수 없도록 하려면 템플릿 코드에서 사용 하세요. 사용자가이 잘못된 기능을 사용하지 않도록 신뢰할 수있는 경우 &.


오버로드 된 unary가있는 사용자 정의 유형 operator&이고 주소를 원하는 경우 addressof.

&말했듯이, 그렇지 않으면 과부하의 목적을 무너 뜨리기 때문에 항상 사용해야한다고 말하고 싶습니다 . 물론 오버로드로 의미있는 작업을 수행 하지 않는 한 ,이 경우에는 필요하지만 addressof(클래스 외부에서는을 (를 this) 사용할 수 있습니다. ) 수행중인 작업에 대해 매우 확신해야합니다.

여기에 더 있습니다-만약 당신이 operator&클래스 외부에서 오버로드하고 싶다면 (당신이 할 수있는), 주소를 반환 하기 위해 사용해야 addressof합니다. 그렇지 않으면 무한 재귀가됩니다 :

struct Class
{
   virtual ~Class() {}
   int x;
};

void* operator&(const Class& x)
{
    //return &x; <---- infinite recursion
    return addressof(x) + 4; //I know this isn't safe
                             //but I also know the intrinsics of my compiler
                             //and platform to know this will actually return
                             //the address to the first data member
}

안전하지 않다는 것을 알고 있습니다.


내 의견 :

클래스와 인터페이스를 디자인하는 팀의 일원이 아니라면 절대로 안됩니다. 나는 개인적으로 그 연산자에 과부하가 걸리는 좋은 이유를 본 적이 없습니다. 그러나 누군가가 의미있는 클래스를 디자인하고 클래스가 공개적으로 사용된다고 가정하면 (즉, 클래스는 특정 라이브러리에서만 내부 사용을위한 것이 아님) 클래스가 일반 코드에서 작동 할 것으로 예상합니다. 당연히 &"주소" 의미합니다. 연산자를 오버로드하는 클래스가 그렇게 현명한 방식으로 설계되지 않은 경우 해당 클래스, period를 사용하지 않습니다. 그 클래스가 깨 졌거나 그것이 속한 라이브러리 외부에서 사용되지 않기 때문입니다.


operator&오버로드 주소의 결과가 아니라 개체의 실제 주소를 알고 싶을 때 사용합니다 .


결국 둘 다 객체의 "주소"를 반환하므로 언제 어떤 것을 사용해야합니까?

오버로드 operator&가 객체의 "주소"라는 보장이 전혀 없으며 , 그렇지 않을 가능성이 있거나 클래스 작성자가 오버로드를하지 않았을 것입니다. 그들은 다른 유형을 반환하기 위해 과부하를 걸 수도 있고, void사람들이 주소를 가져가는 것을 막기 위해 부당하게 노력하는 경우 반환 할 수도 있습니다.

오버로드 되었을 수 있는 객체에 대한 포인터를 원한다면 &(예를 들어 그 유형이 템플릿 매개 변수이므로 알 수 없기 때문에) std::addressof템플릿이 객체의 실제 주소를 반환하지 않는 유형을 지원하지 않는다는 것을 사용 하거나 문서화하십시오. 올바른 유형으로.

참고 URL : https://stackoverflow.com/questions/14820307/when-to-use-addressofx-instead-of-x

반응형