CWG Issue 382 (original) (raw)

This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 117a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2025-04-13


382. Allow typename outside of templates

Section: 13.8 [temp.res]Status: CD1Submitter: Steve AdamczykDate: 8 Nov 2002

[Voted into WP at October 2005 meeting.]

P. J. Plauger, among others, has noted that typename is hard to use, because in a given context it's either required or forbidden, and it's often hard to tell which. It would make life easier for programmers if typenamecould be allowed in places where it is not required, e.g., outside of templates.

Notes from the April 2003 meeting:

There was unanimity on relaxing this requirement on typename. The question was how much to relax it. Everyone agreed on allowing it on all qualified names, which is an easy fix (no syntax change required). But should it be allowed other places? P.J. Plauger said he'd like to see it allowed anywhere a type name is allowed, and that it could actually be a decades-late assist for the infamous "the ice is thin here" typedef problem noted in K&R I.

Proposed resolution (April 2003):

Replace the text at the start of 13.8 [temp.res] paragraph 3:

A qualified-id that refers to a type and in which the nested-name-specifier_depends on a template-parameter (13.8.3 [temp.dep]) shall be prefixed by the keywordtypename to indicate that the qualified-id denotes a type, forming an_elaborated-type-specifier (9.2.9.5 [dcl.type.elab]).

With:

The keyword typename can only be applied to a qualified-id. A_qualified-id_ that refers to a type and in which the _nested-name-specifier_depends on a template-parameter (13.8.3 [temp.dep]) shall be prefixed by the keywordtypename to indicate that the qualified-id_denotes a type, forming an elaborated-type-specifier (9.2.9.5 [dcl.type.elab]). If a qualified-id which has been prefixed by the keyword typename does not denote a type the program is ill-formed. [ Note: The keyword is only required on a qualified-id within a template declaration or definition in which the_nested-name-specifier depends on a template-parameter. ]

Remove 13.8 [temp.res] paragraph 5:

The keyword typename shall only be used in template declarations and definitions, including in the return type of a function template or member function template, in the return type for the definition of a member function of a class template or of a class nested within a class template, and in the_type-specifier_ for the definition of a static member of a class template or of a class nested within a class template. The keyword typename shall be applied only to qualified names, but those names need not be dependent. The keywordtypename shall be used only in contexts in which dependent names can be used. This includes template declarations and definitions but excludes explicit specialization declarations and explicit instantiation declarations. The keywordtypenameis not permitted in a base-specifier or in a mem-initializer; in these contexts a qualified-id that depends on a template-parameter (temp.dep) is implicitly assumed to be a type name.

Note: the claim here that a qualified name preceded bytypename forms an elaborated type specifier conflicts with the changes made in issue 254 (see N1376=02-0034), which introduces typename-specifier.

Notes from October 2003 meeting:

We considered whether typename should be allowed in more places, and decided we only wanted to allow it in qualified names (for now at least).

Core issue 254 changed_elaborated-type-specifier_ to typename-specifier. It also changed 13.8 [temp.res] paragraph 5, which this proposed resolution deletes.

See also issue 468.

Proposed resolution (October, 2004):

  1. Change 13.8 [temp.res] paragraph 3 as follows:

    A When a qualified-id that refers to a type and in which the nested-name-specifier depends on a_template-parameter_ (13.8.3 [temp.dep]) is intended to refer to a type, it shall be prefixed by the keyword typename to indicate that the qualified-id denotes a type, forming a typename-specifier. If the qualified-id in a typename-specifier does not denote a type, the program is ill-formed.

  2. Change 13.8 [temp.res] paragraph 5 as follows:

    The keyword typename shall only be used in template declarations and definitions, including in the return type of a function template or member function template, in the return type for the definition of a member function of a class template or of a class nested within a class template, and in the_type-specifier_ for the definition of a static member of a class template or of a class nested within a class template. The keyword typename shall be applied only to qualified names, but those names need not be dependent. The keywordtypename shall be used only in contexts in which dependent names can be used. This includes template declarations and definitions but excludes explicit specialization declarations and explicit instantiation declarations. A qualified name used as the name in a mem-initializer-id, a_base-specifier_, or an elaborated-type-specifier is implicitly assumed to name a type, without the use of thetypename keyword. [Note: the typenamekeyword is not permitted by the syntax of these constructs. —_end note_]