Table of Contents
The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C
Home Backend Development C++ 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?

Dec 07, 2024 pm 09:56 PM

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:

1

2

3

4

5

6

7

8

9

10

11

int foo(void*);

 

template<typename T> struct S {

  S() { int i = foo(0); }

};

 

void foo(int);

 

int main() {

  S<int> s;

}

Copy after login

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.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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(&s);

}

Copy after login

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.

The above is the detailed content of Why Does Microsoft Visual C Fail to Correctly Implement Two-Phase Template Instantiation?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot Article Tags

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are the types of values ​​returned by c language functions? What determines the return value? What are the types of values ​​returned by c language functions? What determines the return value? Mar 03, 2025 pm 05:52 PM

What are the types of values ​​returned by c language functions? What determines the return value?

Gulc: C library built from scratch Gulc: C library built from scratch Mar 03, 2025 pm 05:46 PM

Gulc: C library built from scratch

C language function format letter case conversion steps C language function format letter case conversion steps Mar 03, 2025 pm 05:53 PM

C language function format letter case conversion steps

What are the definitions and calling rules of c language functions and what are the What are the definitions and calling rules of c language functions and what are the Mar 03, 2025 pm 05:53 PM

What are the definitions and calling rules of c language functions and what are the

distinct usage and phrase sharing distinct usage and phrase sharing Mar 03, 2025 pm 05:51 PM

distinct usage and phrase sharing

Where is the return value of the c language function stored in memory? Where is the return value of the c language function stored in memory? Mar 03, 2025 pm 05:51 PM

Where is the return value of the c language function stored in memory?

How does the C   Standard Template Library (STL) work? How does the C Standard Template Library (STL) work? Mar 12, 2025 pm 04:50 PM

How does the C Standard Template Library (STL) work?

How do I use algorithms from the STL (sort, find, transform, etc.) efficiently? How do I use algorithms from the STL (sort, find, transform, etc.) efficiently? Mar 12, 2025 pm 04:52 PM

How do I use algorithms from the STL (sort, find, transform, etc.) efficiently?

See all articles