2

연산자 오버로드에 대한 인수 목록이 체계적으로 결정되는 방식을 결코 이해하지 못했으며, 지금 당장 가지고있는 문제로 인해 혼란 스럽습니다.운영자 과부하 (특히 '신규') 요인은 어떻게 작동합니까?

단항 연산자에 과부하가 걸리면 하나의 인수가 있거나 클래스 멤버 인 경우 0이됩니다. 2 진 연산자를 오버로드하면 두 개의 인수가 있거나 클래스 구성원 인 경우 하나가 있습니다. 적어도 그것은 그것이 작동하는 것처럼 보일 것입니다. 그러나 operator new (반원이 아님)에게 문제가 있습니다. 코드베이스에서

은 내가 과거에 본 다른 장소에서 같은에서 일하고 A가 #define new new(__FILE__, __LINE__) 및 메모리 디버깅을 위해이 같은 서명 void *new(size_t size, const char *file, unsigned line) 또는 무언가와 해당 기능과 같은 정의가있다 (예를 들어 here 등) . 나는 나의 프로젝트에있는 것이 이전에 링크 된 것과 실제로 다르다는 것을 주목한다. 이것은 어떤 이유로 새로운 배치를 엉망으로 만들기 때문에 나에게는 문제가된다. 내가 보았습니다 C++ 프로그래밍 언어, 그리고 만약 내가 이것을 놓치고 설명합니다.

이와 관련하여 new이 특별합니까? 즉, 특정 언어로 정의 된 추가 디버그 서명이 있습니까? 위에서 언급했듯이, 나는 다른 곳에서 약간 다른 서명을 보았 기 때문에 그것을 좋아하지 않는다. 그렇다면, 다른 사업자는 명백하지 않은 서명을 갖고 있으며, 그 서명은 무엇입니까? 대신 이러한 다양한 시그니처가 특정 구현 관련 추가 기능입니까? 그렇다면 대부분의 구현이 수행하는 것과 관련된 일반 규칙이 있습니까? 양자 택일로, 그것은 내 타이틀에 내포 한 것처럼 아리안 이슈인가? 서명에서 원하는만큼 추가 인수를 붙일 수 있고 new 키워드 자체와 원하는 새로운 유형 사이의 인수를 사용하여 새로 호출하면 무엇을 할 수 있습니까? 아니면 내가 더 혼란스럽고 내가 놓친 다른 것이 있단 말인가?

가장 중요한 것은 단기간에 (실제로 이것을 이해하고 싶지만) 내 배치를 엉망으로 만들고있는 것이 무엇입니까 new? 매크로가 확장을 일으키는 것 같습니다 new ("file.cpp", 100) (class_pointer) class_t. 문제는 괄호 안의 두 그룹일까요, 아니면 다른 것입니까?

답변

0

오버로드 된 연산자의 인수에 대응 당신이 선언대로입니다. 기호 (+) 다음에 오는 연산자의 경우, 추가 인수가 있도록 연산자를 정의하면 명시 적 호출을 통해서만 호출됩니다. (연산자 + (a, b, c, d, e)). new 연산자의 경우 적어도 하나의 arg를 주어야하지만, 원하는 수만큼 arg를 제공 할 수 있습니다. 정규 연산자 오버로딩은 어느 것이 호출되는지 결정합니다.

2

연산자 new는 원하는만큼 많은 오버로드를 제공 할 수있는 기능에 더 가깝고 컴파일러는 함수 오버로드 규칙을 기반으로 버전을 선택합니다.

당신이 new ((T1)value1, (T2)value2) TYPE을 할 때, 즉 라우팅 얻을 것이다 :

operator new(size_t, T1, T2); 

매크로의 문제는 당신이 새의 일반 버전을 호출하고이에 처리기를 사용할 수 있습니다 가정된다는 것이다 이것을 새로운 디버깅 호출로 바꾸십시오. 새 버전의 다른 버전을 호출해야 할 때 매크로가 손상됩니다.

당신이 매크로 것을 해제하여 배치 새로운 (또는 새로운 다른 특별), 당신이 당신의 문제를 해결할 수 호출해야하는 경우 :

#undef new