Использование decltype в спецификаторе вложенного имени

Рассмотрим следующую демонстрационную программу.

#include <iostream>

namespace N
{
    struct A
    {
        static int n;
    };
    
    A A;
}

int N::A::n = 10;

int main() 
{
    std::cout << N::A::n << '\n';
    std::cout << N::decltype( N::A )::n << '\n';
    
    return 0;
}

Программа успешно компилируется с использованием gcc 8.3, например, на www.ideone.com.

Однако если запустить эту программу с помощью MS VS 2019, то компилятор выдает ошибку относительно записи decltype( N::A ) в спецификаторе вложенного имени. Если убрать предыдущее имя N::, то программа успешно компилируется.

Это ошибка компилятора MS VS или неправильно написан спецификатор вложенного имени?


person Vlad from Moscow    schedule 07.05.2021    source источник
comment
несколько связано: stackoverflow .com/questions/65077931/ (Обратите внимание, что в вопросе упоминается, что MSVC принимает аналогичный, но другой недопустимый код, что скорее противоположно ситуации здесь, также OP не упоминает, какой это код.)   -  person 463035818_is_not_a_number    schedule 07.05.2021
comment
И еще - зачем тебе это? Я не понимаю причины N::decltype( N::A )::n. decltype( N::A ) уже разрешается в N::A, поэтому я не понимаю, что даст префикс с N:: (GCC определенно неправильно принимает это - Clang также отклоняет этот код)   -  person mcilloni    schedule 07.05.2021


Ответы (1)


decltype-specifier может появляться только в начале вложенного-спецификатора-имени. В конце концов, он обозначает определенный тип, и после этого для его интерпретации не требуется искать имя. GCC неправильно принимает код: экспериментально кажется, что он просто игнорирует любые предшествующие компоненты после проверки их существования.

person Davis Herring    schedule 07.05.2021