> 백엔드 개발 > C++ > Microsoft Visual C의 2단계 템플릿 인스턴스화는 정말 깨졌습니까? 그렇다면 어떻게 될까요?

Microsoft Visual C의 2단계 템플릿 인스턴스화는 정말 깨졌습니까? 그렇다면 어떻게 될까요?

Linda Hamilton
풀어 주다: 2024-12-07 12:13:10
원래의
846명이 탐색했습니다.

Is Microsoft Visual C  's Two-Phase Template Instantiation Truly Broken, and If So, How?

Microsoft Visual C의 잘못 이해된 "깨진" 2단계 템플릿 인스턴스화

소개

Microsoft Visual C(MSVC )은 2단계 템플릿 인스턴스화 구현에 결함이 있다는 주장으로 종종 비판을 받아왔습니다. 이 기사에서는 근본적인 문제를 조사하고 자세한 설명을 제공하여 이러한 비판의 세부 사항을 조사합니다.

2단계 템플릿 인스턴스화 논쟁

2단계 템플릿 인스턴스화 템플릿 클래스와 함수가 먼저 구문적으로 정확성을 확인한 다음 나중에 사용 사이트에서 완전한 인스턴스화가 발생하는 C의 프로세스입니다. 그러나 MSVC가 이 메커니즘을 제대로 구현하지 않는다는 주장이 제기되었습니다.

문제의 조기 이해

처음에는 MSVC가 기본적인 구문 검사만 수행한 것으로 여겨졌습니다. 템플릿 정의에서 템플릿에 사용된 이름이 선언되었는지 여부를 무시합니다. 그러나 이러한 이해는 불완전합니다.

문제의 실제 성격

MSVC의 2단계 템플릿 인스턴스화와 관련된 실제 문제는 두 개의 상호 연결된 레이어로 구성됩니다.

레이어 1: 잘못된 첫 번째 단계 조회

MSVC는 다음 예와 같이 비종속 표현식에 대한 초기(첫 번째 단계) 조회를 수행하지 못합니다.

int foo(void*);

template<typename T> struct S {
  S() { int i = foo(0); }
};

void foo(int);
로그인 후 복사

MSVC는 이 조회를 두 번째 단계로 연기합니다. 실수로 표현식을 'foo(int)'에 바인딩하여 오류가 발생합니다.

레이어 2: 잘못된 두 번째 단계 조회

MSVC의 템플릿 조회 두 번째 단계에도 결함이 있습니다. C 표준에서는 ADL 지정 네임스페이스가 두 번째 단계에서 확장되도록 지정하지만 MSVC는 비ADL 조회도 잘못 확장합니다.

이는 다음 예에서 설명할 수 있습니다.

namespace N {
  struct S {};
}

void bar(void *) {}

template <typename T> void foo(T *t) {
  bar(t);
}

void bar(N::S *s) {}
로그인 후 복사

종속적임에도 불구하고 bar(t)에 대한 호출이 void bar(N::S *s)로 잘못 해석되어 부적절한 동작을 보여줍니다. MSVC의 두 번째 단계 조회.

결론

Microsoft Visual C의 2단계 템플릿 인스턴스화 구현에는 실제로 결함이 있지만 원래 이해했던 단순한 방식은 아닙니다. 문제는 잘못된 1단계와 2단계 조회 간의 복잡한 상호작용으로 인해 특정 코드 구성에 오류나 잘못된 동작이 발생할 수 있다는 것입니다.

위 내용은 Microsoft Visual C의 2단계 템플릿 인스턴스화는 정말 깨졌습니까? 그렇다면 어떻게 될까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿