"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Why Does Microsoft Visual C++ Fail to Correctly Implement Two-Phase Template Instantiation?

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

2025-02-06에 게시되었습니다
검색:200

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

The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C++

Problem Statement:

Users commonly express concerns that Microsoft Visual C++ (MSVC) struggles with correctly implementing two-phase template instantiation. What specific aspects of the mechanism fail to operate as expected?

Background:

Two-phase template instantiation involves an initial syntax check that MSVC reportedly performs. However, doubts arise regarding whether this check verifies whether names utilized within templates are appropriately declared.

Explanation:

Indeed, MSVC's initial syntax check is limited in scope. It fails to check for the presence of declared names, leading to compilation issues when names lack proper declarations.

To illustrate this, consider the following example:

int foo(void*);

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

void foo(int);

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

A standard-compliant compiler would resolve the foo(0) call during the first phase and bind it to foo(void*). However, MSVC postpones this process to the second phase, incorrectly binding foo(0) to foo(int) and resulting in an error.

Moreover, MSVC's implementation of the second phase deviates from the language specification in two ways:

  1. It extends the non-ADL lookup with declarations accumulated during the second phase.
  2. It incorrectly resolves dependent expressions, such as bar(t) in the code below, to declarations that are only visible during the second phase.
namespace N {
  struct S {};
}

void bar(void *) {}

template &lt;typename T&gt; void foo(T *t) {
  bar(t);
}

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

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

In both cases, MSVC's behavior contravenes the specified separation between the first and second phases of template instantiation. This incorrect implementation persists in Visual Studio 2015.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3