내장 유형의 소멸자 (int, char 등)
C ++에서 다음 코드는 컴파일러 오류를 제공합니다.
void destruct1 (int * item)
{
item->~int();
}
이 코드는 거의 동일합니다. int를 다른 유형으로 typedef하면 마술이 발생합니다.
typedef int myint;
void destruct2 (myint * item)
{
item->~myint();
}
두 번째 코드가 작동하는 이유는 무엇입니까? int가 typedef 되었기 때문에 소멸자를 얻습니까?
왜 이렇게하고 싶은지 궁금한 경우 : 이것은 C ++ 코드를 리팩토링하는 데서 비롯됩니다. 표준 힙을 제거하고 자체 제작 된 풀로 대체합니다. 이를 위해서는 새로운 배치와 소멸자를 호출해야합니다. 기본 유형에 대한 소멸자를 호출하는 것은 쓸모가 없다는 것을 알고 있지만, 그럼에도 불구하고 나중에 POD를 실제 클래스로 대체 할 경우를 대비하여 코드에서이를 원합니다.
naked int는 작동하지 않지만 typedefed는 작동한다는 것을 알아내는 것은 꽤 놀랍습니다.
Btw-템플릿 기능과 관련된 솔루션이 있습니다. 템플릿 안에 typedef 만 있으면 모든 것이 정상입니다.
이것이 일반 매개 변수에 대해 코드가 작동하도록하는 이유입니다. 컨테이너 C를 고려하십시오.
template<typename T>
struct C {
// ...
~C() {
for(size_t i = 0; i<elements; i++)
buffer[i].~T();
}
};
내장형에 대한 특별한 경우를 소개하는 것은 성 가실 것입니다. 따라서 C ++를 사용하면 T가 int
. 거룩한 표준은 다음과 12.4 p15
같이 말합니다 .
소멸자의 명시 적 호출에 대한 표기법은 모든 스칼라 유형 이름에 사용할 수 있습니다. 이를 허용하면 주어진 유형에 대해 소멸자가 존재하는지 알 필요없이 코드를 작성할 수 있습니다.
일반 int와 typedef'ed int를 사용하는 것의 차이점은 구문 적으로 다른 것입니다. 규칙은 소멸자 호출에서 뒤에있는 ~
것은 유형 이름이라는 것입니다. int
그런 것은 아니지만 typedef-name은입니다. 에서 찾아보십시오 7.1.5.2
.
참고 URL : https://stackoverflow.com/questions/456310/destructors-of-builtin-types-int-char-etc
'development' 카테고리의 다른 글
IntelliJ IDEA 및 Gradle- '(groovy.lang.Closure)'에 적용 할 수 없습니다. (0) | 2020.12.12 |
---|---|
왜 npm을 사용하여 얀을 설치하지 않습니까? (0) | 2020.12.12 |
CSS에서 RGB 색상 값에 십진수보다 16 진수를 사용하는 데 좋은 이유가 있습니까? (0) | 2020.12.12 |
djb2 알고리즘에서 5381과 33이 왜 그렇게 중요한가요? (0) | 2020.12.12 |
WiX를 사용하여 Windows 서비스를 설치하고 시작하는 방법 (0) | 2020.12.12 |