Title
Nested classes and the “current instantiation”
Status
c++11
Section
13.8.3.2 [temp.dep.type]
Submitter
James Widman

Created on 2006-08-23.00:00:00 last changed 96 months ago

Messages

Date: 2011-12-15.00:00:00

Proposed resolution (December, 2011):

This issue is resolved by the resolution of issue 1043.

Date: 2011-04-15.00:00:00

Additional note (April, 2011):

It appears that these concerns are addressed by the resolution of issue 1043 in document N3283.

Date: 2020-12-15.00:00:00

In 13.8.3.2 [temp.dep.type] paragraph 5 we have:

A name is a member of an unknown specialization if the name is a qualified-id in which the nested-name-specifier names a dependent type that is not the current instantiation.

So given:

    template<class T> struct A {
        struct B {
            struct C {
                A<T>::B::C f();
            };
        };
    };

it appears that the name A<T>::B::C should be taken as a member of an unknown specialization, because the WP refers to “the” current instantiation, implying that there can be at most one at any given time. At the declaration of f(), the current instantiation is C, so A<T>::B is not the current instantiation.

Would it be better to refer to “a known instantiation” instead of “the current instantiation?”

Mike Miller:

I agree that there is a problem here, but I don't think the “current instantiation” terminology needs to be replaced. By way of background, paragraph 1 makes it clear that A<T>::B “refers to” the current instantiation:

In the definition of a class template, a nested class of a class template, a member of a class template, or a member of a nested class of a class template, a name refers to the current instantiation if it is

  • the injected-class-name (Clause 11 [class]) of the class template or nested class,

  • in the definition of a primary class template, the name of the class template followed by the template argument list of the primary template (as described below) enclosed in <>,

  • in the definition of a nested class of a class template, the name of the nested class referenced as a member of the current instantiation...

A<T>::B satisfies bullet 3. Paragraph 4 says,

A name is a member of the current instantiation if it is

  • An unqualified name that, when looked up, refers to a member of a class template. [Note: this can only occur when looking up a name in a scope enclosed by the definition of a class template. —end note]

  • A qualified-id in which the nested-name-specifier refers to the current instantiation.

So clearly by paragraphs 1 and 4, A<T>::B::C is a member of the current instantiation. The problem is in the phrasing of paragraph 5, which incorrectly requires that the nested-name-specifier “be” the current instantiation rather than simply “referring to” the current instantiation, which would be the correct complement to paragraph 4. Perhaps paragraph 5 could simply be rephrased as, “...a dependent type and it is not a member of the current instantiation.”

(Paragraph 1 may require a bit more wordsmithing to make it truly recursive across multiple levels of nested classes; as it stands, it's not clear whether the name of a nested class of a nested class of a class template is covered or not.)

History
Date User Action Args
2014-03-03 00:00:00adminsetstatus: fdis -> c++11
2012-01-17 00:00:00adminsetmessages: + msg3684
2012-01-17 00:00:00adminsetstatus: review -> fdis
2011-04-10 00:00:00adminsetmessages: + msg3271
2011-04-10 00:00:00adminsetstatus: open -> review
2006-08-23 00:00:00admincreate