执行限定名称查找时,Clang和GCC之间的行为不同

Sup*_*mum 9 c++ typedef namespaces language-lawyer name-lookup

考虑以下程序:

#include <iostream>

namespace N {
    int j = 1;
}

namespace M {
    typedef int N;
    void f() {
        std::cout << N::j << std::endl;
    }
}

int main() { M::f(); }
Run Code Online (Sandbox Code Playgroud)

使用clang编译它会产生以下编译器错误:

prog.cc:10:22: error: 'N' (aka 'int') is not a class, namespace, or
enumeration
    std::cout << N::j << std::endl;
                 ^ 1 error generated.
Run Code Online (Sandbox Code Playgroud)

GCC不会给出任何编译器错误.我正在试图弄清楚我应该为什么编译错误报告.哪个编译器具有正确的行为和原因(引用c ++标准)?

Wandbox - Clang:http://melpon.org/wandbox/permlink/s0hKOxCFPgq5aSmJ

Wandbox - GCC:http://melpon.org/wandbox/permlink/i2kOl3qTBVUcJVbZ

Rei*_*ica 11

Clang在这个问题上是正确的.引用C++ 11,3.4.3/1 [basic.lookup.qual]:

...如果嵌套名称说明:: 符中的作用域解析运算符前面没有decltype-specifier,则查找之前的名称仅考虑其专门化为类型的名称空间,类型和模板.如果找到的名称未指定名称空间或类,枚举或依赖类型,则程序格式错误.::

根据这个子句,在查找期间应该考虑类型,因此N应该找到typedef .由于它没有指定命名空间,类,枚举或依赖类型,因此程序格式不正确.

  • @MatsPetersson标准意味着当它说"形成不良"时需要诊断.当不需要诊断时,通常会说"程序格式错误,无需诊断",未定义情况下"行为未定义". (4认同)