Рассмотрим следующую демонстрационную программу.
#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 или неправильно написан спецификатор вложенного имени?
N::decltype( N::A )::n.decltype( N::A )уже разрешается вN::A, поэтому я не понимаю, что даст префикс сN::(GCC определенно неправильно принимает это - Clang также отклоняет этот код) - person mcilloni   schedule 07.05.2021