-1

考虑以下演示程序。

#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 编译器的错误还是嵌套名称说明符写错了?

4

1 回答 1

3

decltype-specifier永远不会出现,除非在nested -name-specifier的开头。毕竟,它指定了一个特定的类型,之后不需要名称查找来解释它。GCC 接受代码是错误的:通过实验,它似乎只是在检查它们是否存在之后忽略任何前面的组件。

于 2021-05-07T20:17:02.180 回答