<a 
  name="Doc-Start"></a> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  "http://www.w3.org/TR/html4/loose.dtd">  
<html > 
<head><title>Local Classes and Linkage</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<meta name="generator" content="TeX4ht (http://www.cis.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
<!-- html --> 
<meta name="src" content="local_classes_proposal.tex"> 
<meta name="date" content="2001-10-15 13:54:00"> 
<link rel="stylesheet" type="text/css" href="n1353.css"> 
</head><body 
>
<div align="center" class="maketitle">

<h2 class="titleHead">Local Classes and Linkage</h2>
<div class="author" align="center"><span 
class="ptmr7t-x-x-120">Anthony Williams</span></div>
<br>
<div class="date" align="center"><span 
class="ptmr7t-x-x-120">15th October 2001</span></div>
</div>
<a 
  name="section.1"></a>
<h3 class="sectionHead"><span class="titlemark">1</span> <a 
  name="x1-10001"></a>Introduction</h3>
<!--l. 12--><p class="noindent"><a 
  name="sec:introduction"></a>
<!--l. 14--><p class="noindent">Currently, classes can be declared and defined at block scope, but these classes and their member functions have no linkage, which
prohibits their use as template arguments.
<!--l. 17--><p class="noindent">The idea behind this proposal is to make local classes fully-fledged citizens of the C++ type system, usable wherever a
namespace-scope class could be used.
<!--l. 20--><p class="noindent">This would enable functors for use with standard algorithms to be written in the block in which they are used, rather than having to
write them outside the current function, at namespace or class scope.
<a 
  name="section.2"></a>
<h3 class="sectionHead"><span class="titlemark">2</span> <a 
  name="x1-20002"></a>Naming</h3>
<!--l. 25--><p class="noindent"><a 
  name="sec:naming"></a>
<!--l. 27--><p class="noindent">For local classes to have external linkage, we need a way in which they can be uniquely identified, so that classes or objects of the
same name from a different scope do not cause name clashes.
<!--l. 30--><p class="noindent">To resolve this issue, I propose that each block scope that defines local classes be given a unique identifier, similar
to the way that anonymous namespaces are given unique identifiers in different translation units. The local classes
defined within each block scope are then made members of a namespace with this uniquely-identifying name. Since
this name is compiler-generated and unique, there is thus no way of identifying a local class from outside its block.
e.g.
<div class="fancyvrb" id="fancyvrb1">
<!--l. 36--><p class="noindent"><a 
  name="FancyVerbLine.1"></a><br class="fancyvrb"><a 
  name="x1-2002r1"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">void</span><span 
class="pcrr7tn-">&nbsp;f()</span></code>
<a 
  name="FancyVerbLine.2"></a>
<a 
  name="FancyVerbLine.3"></a><br class="fancyvrb"><a 
  name="x1-2004r2"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.4"></a><br class="fancyvrb"><a 
  name="x1-2006r3"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>

<a 
  name="FancyVerbLine.5"></a><br class="fancyvrb"><a 
  name="x1-2008r4"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<br class="fancyvrb"><a 
  name="x1-2010r5"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
</div>
<!--l. 43--><p class="noindent">is equivalent to
<div class="fancyvrb" id="fancyvrb2">
<!--l. 46--><p class="noindent"><a 
  name="FancyVerbLine.1"></a><br class="fancyvrb"><a 
  name="x1-2012r1"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">namespace</span><span 
class="pcrr7tn-">&nbsp;__unique_name_1</span></code>
<a 
  name="FancyVerbLine.2"></a>
<a 
  name="FancyVerbLine.3"></a><br class="fancyvrb"><a 
  name="x1-2014r2"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.4"></a><br class="fancyvrb"><a 
  name="x1-2016r3"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.5"></a><br class="fancyvrb"><a 
  name="x1-2018r4"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.6"></a><br class="fancyvrb"><a 
  name="x1-2020r5"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
<a 
  name="FancyVerbLine.7"></a><br class="fancyvrb"><a 
  name="x1-2022r6"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code></code>
<a 
  name="FancyVerbLine.8"></a><br class="fancyvrb"><a 
  name="x1-2024r7"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">void</span><span 
class="pcrr7tn-">&nbsp;f()</span></code>
<a 
  name="FancyVerbLine.9"></a><br class="fancyvrb"><a 
  name="x1-2026r8"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.10"></a><br class="fancyvrb"><a 
  name="x1-2028r9"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;using</span><span 
class="pcrr7tn-">&nbsp;__unique_name_1::X;</span></code>
<br class="fancyvrb"><a 
  name="x1-2030r10"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
</div>
<!--l. 58--><p class="noindent">and
<div class="fancyvrb" id="fancyvrb3">
<!--l. 61--><p class="noindent"><a 
  name="FancyVerbLine.1"></a><br class="fancyvrb"><a 
  name="x1-2032r1"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">void</span><span 
class="pcrr7tn-">&nbsp;f()</span></code>
<a 
  name="FancyVerbLine.2"></a>
<a 
  name="FancyVerbLine.3"></a><br class="fancyvrb"><a 
  name="x1-2034r2"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.4"></a><br class="fancyvrb"><a 
  name="x1-2036r3"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.5"></a><br class="fancyvrb"><a 
  name="x1-2038r4"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.6"></a><br class="fancyvrb"><a 
  name="x1-2040r5"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code></code>
<a 
  name="FancyVerbLine.7"></a><br class="fancyvrb"><a 
  name="x1-2042r6"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{</span></code>
<a 
  name="FancyVerbLine.8"></a><br class="fancyvrb"><a 
  name="x1-2044r7"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.9"></a><br class="fancyvrb"><a 
  name="x1-2046r8"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.10"></a><br class="fancyvrb"><a 
  name="x1-2048r9"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;}</span></code>
<a 
  name="FancyVerbLine.11"></a><br class="fancyvrb"><a 
  name="x1-2050r10"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code></code>
<a 
  name="FancyVerbLine.12"></a><br class="fancyvrb"><a 
  name="x1-2052r11"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{</span></code>
<a 
  name="FancyVerbLine.13"></a><br class="fancyvrb"><a 
  name="x1-2054r12"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.14"></a><br class="fancyvrb"><a 
  name="x1-2056r13"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.15"></a><br class="fancyvrb"><a 
  name="x1-2058r14"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code></code>
<a 
  name="FancyVerbLine.16"></a><br class="fancyvrb"><a 
  name="x1-2060r15"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{</span></code>

<a 
  name="FancyVerbLine.17"></a><br class="fancyvrb"><a 
  name="x1-2062r16"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.18"></a><br class="fancyvrb"><a 
  name="x1-2064r17"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.19"></a><br class="fancyvrb"><a 
  name="x1-2066r18"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;}</span></code>
<a 
  name="FancyVerbLine.20"></a><br class="fancyvrb"><a 
  name="x1-2068r19"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;}</span></code>
<br class="fancyvrb"><a 
  name="x1-2070r20"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
</div>
<!--l. 83--><p class="noindent">is equivalent to
<div class="fancyvrb" id="fancyvrb4">
<!--l. 86--><p class="noindent"><a 
  name="FancyVerbLine.1"></a><br class="fancyvrb"><a 
  name="x1-2072r1"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">namespace</span><span 
class="pcrr7tn-">&nbsp;__unique_name_1</span></code>
<a 
  name="FancyVerbLine.2"></a>
<a 
  name="FancyVerbLine.3"></a><br class="fancyvrb"><a 
  name="x1-2074r2"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.4"></a><br class="fancyvrb"><a 
  name="x1-2076r3"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.5"></a><br class="fancyvrb"><a 
  name="x1-2078r4"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.6"></a><br class="fancyvrb"><a 
  name="x1-2080r5"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
<a 
  name="FancyVerbLine.7"></a><br class="fancyvrb"><a 
  name="x1-2082r6"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">namespace</span><span 
class="pcrr7tn-">&nbsp;__unique_name_2</span></code>
<a 
  name="FancyVerbLine.8"></a><br class="fancyvrb"><a 
  name="x1-2084r7"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.9"></a><br class="fancyvrb"><a 
  name="x1-2086r8"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.10"></a><br class="fancyvrb"><a 
  name="x1-2088r9"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.11"></a><br class="fancyvrb"><a 
  name="x1-2090r10"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
<a 
  name="FancyVerbLine.12"></a><br class="fancyvrb"><a 
  name="x1-2092r11"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">namespace</span><span 
class="pcrr7tn-">&nbsp;__unique_name_3</span></code>
<a 
  name="FancyVerbLine.13"></a><br class="fancyvrb"><a 
  name="x1-2094r12"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.14"></a><br class="fancyvrb"><a 
  name="x1-2096r13"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.15"></a><br class="fancyvrb"><a 
  name="x1-2098r14"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.16"></a><br class="fancyvrb"><a 
  name="x1-2100r15"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
<a 
  name="FancyVerbLine.17"></a><br class="fancyvrb"><a 
  name="x1-2102r16"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">namespace</span><span 
class="pcrr7tn-">&nbsp;__unique_name_4</span></code>
<a 
  name="FancyVerbLine.18"></a><br class="fancyvrb"><a 
  name="x1-2104r17"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.19"></a><br class="fancyvrb"><a 
  name="x1-2106r18"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;class</span><span 
class="pcrr7tn-">&nbsp;X</span></code>
<a 
  name="FancyVerbLine.20"></a><br class="fancyvrb"><a 
  name="x1-2108r19"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{};</span></code>
<a 
  name="FancyVerbLine.21"></a><br class="fancyvrb"><a 
  name="x1-2110r20"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
<a 
  name="FancyVerbLine.22"></a><br class="fancyvrb"><a 
  name="x1-2112r21"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code></code>
<a 
  name="FancyVerbLine.23"></a><br class="fancyvrb"><a 
  name="x1-2114r22"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">void</span><span 
class="pcrr7tn-">&nbsp;f()</span></code>
<a 
  name="FancyVerbLine.24"></a><br class="fancyvrb"><a 
  name="x1-2116r23"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">{</span></code>
<a 
  name="FancyVerbLine.25"></a><br class="fancyvrb"><a 
  name="x1-2118r24"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;using</span><span 
class="pcrr7tn-">&nbsp;__unique_name_1::X;</span></code>
<a 
  name="FancyVerbLine.26"></a><br class="fancyvrb"><a 
  name="x1-2120r25"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code></code>
<a 
  name="FancyVerbLine.27"></a><br class="fancyvrb"><a 
  name="x1-2122r26"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{</span></code>
<a 
  name="FancyVerbLine.28"></a><br class="fancyvrb"><a 
  name="x1-2124r27"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;using</span><span 
class="pcrr7tn-">&nbsp;__unique_name_2::X;</span></code>

<a 
  name="FancyVerbLine.29"></a><br class="fancyvrb"><a 
  name="x1-2126r28"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;}</span></code>
<a 
  name="FancyVerbLine.30"></a><br class="fancyvrb"><a 
  name="x1-2128r29"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code></code>
<a 
  name="FancyVerbLine.31"></a><br class="fancyvrb"><a 
  name="x1-2130r30"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{</span></code>
<a 
  name="FancyVerbLine.32"></a><br class="fancyvrb"><a 
  name="x1-2132r31"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;using</span><span 
class="pcrr7tn-">&nbsp;__unique_name_3::X;</span></code>
<a 
  name="FancyVerbLine.33"></a><br class="fancyvrb"><a 
  name="x1-2134r32"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code></code>
<a 
  name="FancyVerbLine.34"></a><br class="fancyvrb"><a 
  name="x1-2136r33"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;{</span></code>
<a 
  name="FancyVerbLine.35"></a><br class="fancyvrb"><a 
  name="x1-2138r34"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;using</span><span 
class="pcrr7tn-">&nbsp;__unique_name_4::X;</span></code>
<a 
  name="FancyVerbLine.36"></a><br class="fancyvrb"><a 
  name="x1-2140r35"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;}</span></code>
<a 
  name="FancyVerbLine.37"></a><br class="fancyvrb"><a 
  name="x1-2142r36"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;}</span></code>
<br class="fancyvrb"><a 
  name="x1-2144r37"></a><span 
class="pcrr7tn-">&nbsp;</span><span 
class="pcrr7tn-">&nbsp;</span><code><span 
class="pcrr7tn-">}</span></code>
</div>
<!--l. 125--><p class="noindent">It is essential that different overloads of the same function name yield different unique names for their enclosed scopes, and that
different instantations or specializations of the same function template also yield different unique names, so that name lookup rules
remain unchanged, and the One Definition Rule is not violated.
<a 
  name="section.3"></a>
<h3 class="sectionHead"><span class="titlemark">3</span> <a 
  name="x1-30003"></a>Static Instances of Local Class Objects</h3>
<!--l. 131--><p class="noindent"><a 
  name="sec:stat-inst-local"></a>
<!--l. 133--><p class="noindent">Variables declared at block scope may have static storage duration, in which case all references to that variable within the given scope
refer to the same instance of the variable, even if the function is declared <code><span 
class="pcrb7t-">inline</span></code> and used in multiple translation units. In
order to maintain this functionality, even when the static object has local-class-type, the algorithm for generating the
unique name must be such that the same names are generated for the same function definition in different translation
units.
<!--l. 139--><p class="noindent">Consequently, the algorithm for generating the unique names must depend solely on the scope in which the current
function definition lies, the name and signature of the enclosing function, any relevant template parameters, and the
information available within the function definition. The precise details of the algorithm remain implementation
defined.
<a 
  name="section.4"></a>
<h3 class="sectionHead"><span class="titlemark">4</span> <a 
  name="x1-40004"></a>Local Class within Local Classes</h3>
<!--l. 146--><p class="noindent"><a 
  name="sec:local-class-within"></a>
<!--l. 148--><p class="noindent">Local classes can have member functions, which introduce block scopes, that may therefore have their own local classes, and so
forth. All such classes should have external linkage, and be assigned appropriate unique names, just as if they were defined within a
normal namespace-scope function.
<a 
  name="section.5"></a>
<h3 class="sectionHead"><span class="titlemark">5</span> <a 
  name="x1-50005"></a>Forward Declarations and Out-of-line Member Definitions</h3>
<!--l. 154--><p class="noindent"><a 
  name="sec:forw-decl-out"></a>
<!--l. 156--><p class="noindent">No change is proposed to the language rules regarding forward declarations and out-of-line member definitions &#8212; both remain illegal
for local classes.

<a 
  name="section.6"></a>
<h3 class="sectionHead"><span class="titlemark">6</span> <a 
  name="x1-60006"></a>Templates</h3>
<!--l. 160--><p class="noindent"><a 
  name="sec:templates"></a>
<!--l. 162--><p class="noindent">The interaction of local classes with templates is a key part of this proposal. Firstly, if a local class is defined within a function
template, or a member function of a class template, it is essential that every unique instantiation of the function yields a unique name
for the local classes namespace.
<!--l. 166--><p class="noindent">Secondly, as local classes now have external linkage, it becomes possible to instantiate a template with a local class as a template
parameter. If the same template is instantiated for different local classes of the same name, each instantiation should be unique. This
effect can be correctly achieved by treating each local class as a member of its appropriate uniquely-named namespace, as
above.
<!--l. 171--><p class="noindent">Currently, local classes are not permitted to have member templates. I see this as a needless restriction, now that local classes have
external linkage.
<!--l. 174--><p class="noindent">Also, it may be desirable to specialize a template for a particular local class. This would have to be done within the block in
which the local class is defined, as the class cannot be identified by name from outside that block. However, template
declarationsare not permitted at block scope, so templates cannot be specialized for local classes without a further language
change.
<!--l. 179--><p class="noindent">Finally, it may be desirable to define local templates. Again, this requires a further language change.
<a 
  name="section.7"></a>
<h3 class="sectionHead"><span class="titlemark">7</span> <a 
  name="x1-70007"></a>Friends</h3>
<!--l. 183--><p class="noindent"><a 
  name="sec:friends"></a>
<!--l. 185--><p class="noindent">Currently, local classes are only permitted to have friends that have already been declared in another scope. Though this can be
inconvenient, I see problems with lifting this restriction, such as what scope the friend class or function is a member of, if it is
declared or defined within a local class definition.
<a 
  name="section.8"></a>
<h3 class="sectionHead"><span class="titlemark">8</span> <a 
  name="x1-80008"></a>Required Changes</h3>
<!--l. 190--><p class="noindent"><a 
  name="sec:required-changes"></a>
<a 
  name="section*.1"></a>
<h4 class="likesubsectionHead"><a 
  name="x1-90008"></a>3.5 Program and Linkage [basic.link]</h4> <a 
  name="sec:3.5-program-linkage"></a>
<!--l. 196--><p class="noindent">Add a new paragraph between current paragraphs 7 and 8:
     <div class="quote">
     <!--l. 199--><p class="noindent">A name having local scope (3.3.2) has external linkage if it is the name of:
     <!--l. 201--><p class="noindent">&#8212; a named class (clause 9), or an unnamed class defined in a typedef declaration in which the class has the
     typedef name for linkage purposes (7.1.3); or
     <!--l. 204--><p class="noindent">&#8212;  a  named  enumeration  (7.2),  or  an  unnamed  enumeration  defined  in  a  typedef  declaration  in  which  the
     enumeration has the typedef name for linkage purposes (7.1.3); or
     <!--l. 207--><p class="noindent">&#8212; enumerator belonging to an enumeration with external linkage.</div>

<!--l. 210--><p class="noindent">Change the current paragraph 8 (new paragraph 9) to remove references to local classes and enumerations:
     <div class="quote">
     <!--l. 213--><p class="noindent">Names not covered by these rules have no linkage. Moreover, except as noted, a name declared in a local
     scope (3.3.2) has no linkage. A name with no linkage shall not be used to declare an entity with linkage. If a
     declaration uses a typedef name, it is the linkage of the type name to which the typedef refers that is considered.
     This implies that names with no linkage cannot be used as template arguments (14.3).</div>
<a 
  name="section*.2"></a>
<h4 class="likesubsectionHead"><a 
  name="x1-100008"></a>9.3 Member Functions [class.mfct]</h4> <a 
  name="sec:9.3-member-functions"></a>
<!--l. 223--><p class="noindent">Change the note in paragraph 3 to allow local class member functions to have linkage:
     <div class="quote">
     <!--l. 226--><p class="noindent">An inline member function (whether static or nonstatic) may also be defined outside of its class definition
     provided either its declaration in the class definition or its definition outside of the class definition declares the
     function as inline. <span 
class="ptmb7t-">[Note: both member functions of a class in namespace scope and member functions of</span>
     <span 
class="ptmb7t-">a local class (9.8) have external linkage.]</span></div>
<a 
  name="section*.3"></a>
<h4 class="likesubsectionHead"><a 
  name="x1-110008"></a>9.8 Local class declarations [class.local]</h4> <a 
  name="sec:9.8-local-class"></a>
<!--l. 235--><p class="noindent">Add a new paragraph after paragraph 4:
     <div class="quote">
     <!--l. 238--><p class="noindent">Local classes have external linkage (3.5). Each block that contains local class definitions is assigned a unique
     namespace name in the innermost namespace enclosing the function definition of which it is a member. This
     name shall depend only on the scope of which the function is a member, the function name and signature, and
     any relevant template parameters. Each local class defined within this block is considered to have been defined
     inside this uniquely-named namespace for linkage purposes. The same function definition will always generate
     the same unique namespace name, even in different translation units. (Note: This enables block-scope objects
     of static duration can refer to the same object, even if they have local-class type, and are defined in an inline
     function used in multiple translation units)</div>
<a 
  name="section*.4"></a>
<h4 class="likesubsectionHead"><a 
  name="x1-120008"></a>14.5.2 Member templates [temp.mem]</h4> <a 
  name="sec:14.5.2-memb-templ"></a>
<!--l. 252--><p class="noindent">Remove the restriction on member-templates of local classes in paragraph 2:

     <div class="quote">
     <!--l. 255--><p class="noindent">Access control rules (clause 11) apply to member template names. A destructor shall not be a member template.
     A normal (non-template) member function with a given name and type and a member function template of the
     same name, which could be used to generate a specialization of the same type, can both be declared in a class.
     When both exist, a use of that name and type refers to the non-template member unless an explicit template
     argument list is supplied.</div>
 
</body></html> 



