>백엔드 개발 >C++ >Microsoft Visual C가 2단계 템플릿 인스턴스화를 올바르게 구현하지 못하는 이유는 무엇입니까?

Microsoft Visual C가 2단계 템플릿 인스턴스화를 올바르게 구현하지 못하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-07 21:56:12205검색

Why Does Microsoft Visual C   Fail to Correctly Implement Two-Phase Template Instantiation?

Microsoft Visual C에서 "깨진" 2단계 템플릿 인스턴스화의 미스터리

문제 설명:

일반적으로 사용자 Microsoft Visual C(MSVC)가 2단계 템플릿 인스턴스화를 올바르게 구현하는 데 어려움을 겪고 있다는 우려를 표명합니다. 메커니즘의 어떤 특정 측면이 예상대로 작동하지 않습니까?

배경:

2단계 템플릿 인스턴스화에는 MSVC가 수행한다고 알려진 초기 구문 검사가 포함됩니다. 그러나 이 검사가 템플릿 내에서 사용된 이름이 적절하게 선언되었는지 여부를 확인하는지 여부에 대해서는 의문이 제기됩니다.

설명:

실제로 MSVC의 초기 구문 검사는 범위가 제한되어 있습니다. 선언된 이름이 있는지 확인하지 못하여 이름에 적절한 선언이 없으면 컴파일 문제가 발생합니다.

이를 설명하려면 다음 예를 고려하세요.

int foo(void*);

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

void foo(int);

int main() {
  S<int> s;
}

표준 호환 컴파일러 첫 번째 단계에서 foo(0) 호출을 해결하고 이를 foo(void*)에 바인딩합니다. 그러나 MSVC는 이 프로세스를 두 번째 단계로 연기하여 foo(0)를 foo(int)에 잘못 바인딩하여 오류가 발생합니다.

게다가 MSVC의 두 번째 단계 구현은 두 가지 측면에서 언어 사양에서 벗어납니다. :

  1. 두 번째 동안 누적된 선언으로 Non-ADL 조회를 확장합니다.
  2. 아래 코드의 bar(t)와 같은 종속 표현식을 두 번째 단계에서만 표시되는 선언으로 잘못 해석합니다.
namespace N {
  struct S {};
}

void bar(void *) {}

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

void bar(N::S *s) {}

int main() {
  N::S s;
  foo(&amp;s);
}

두 단계 모두에서 경우 MSVC의 동작은 템플릿 인스턴스화의 첫 번째 단계와 두 번째 단계 사이에 지정된 구분을 위반합니다. 이 잘못된 구현은 Visual Studio 2015에서 지속됩니다.

위 내용은 Microsoft Visual C가 2단계 템플릿 인스턴스화를 올바르게 구현하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.