C++ 在typedef中使用相同的名称,并从命名空间中使用
示例代码:C++ 在typedef中使用相同的名称,并从命名空间中使用,c++,namespaces,language-lawyer,typedef,ambiguous,C++,Namespaces,Language Lawyer,Typedef,Ambiguous,示例代码: struct X { void f() {} }; typedef X A; namespace N { struct A { void g() {} }; }; using N::A; int main() { A a; a.f(); } 这段代码编译正确,而且A创建一个X,而不是N::a 标准中的哪条规则涵盖了这种行为?我期待着一个A的错误将是不明确的。如果我将第一个结构命名为A而不是X,并删除typedef,那么我确实会得到这样一个错误。(g+
struct X { void f() {} };
typedef X A;
namespace N {
struct A { void g() {} };
};
using N::A;
int main()
{
A a;
a.f();
}
这段代码编译正确,而且A代码>创建一个X
,而不是N::a
标准中的哪条规则涵盖了这种行为?我期待着一个A的错误代码>将是不明确的。如果我将第一个结构命名为A
而不是X
,并删除typedef,那么我确实会得到这样一个错误。(g++8.3)根据using N::A
将非限定的A
引入using声明出现的声明区域
。。。非限定id在声明性区域中声明,其中using声明作为using声明符引入的每个声明的同义词出现
因此,模糊性由
由于using声明是一个声明,所以对同一声明区域中同名声明的限制也适用于using声明
及
给定单个声明区域中的一组声明,每个
指定相同的非限定名称
- 它们应全部引用同一实体,或全部引用功能和功能模板;或
- 仅一个声明应声明不是typedef名称的类名或枚举名,其他声明应全部引用同一变量、非静态数据成员或枚举器,或全部引用函数和函数模板;在这种情况下,类名或枚举名是隐藏的
OP中的typedef
声明和using声明都没有填充任何一个项目符号,因此同一声明区域中的这对声明格式不正确。Clang表示对A
的引用不明确。使用N::A
没有指定非限定名称,所以我不确定第二个引号是如何应用的?(也没有编译器报告使用N::A;
的错误,尽管这可能是一个bug)@M-使用N::A
将非限定名称A
添加到它出现的声明性区域中。但也许是查找应该引起注意。我会仔细检查的。在名称查找中找不到任何内容。因此,我不确定它在引入名称或查找名称时是否会发出诊断,但我确定上面的两个项目符号会使其格式错误。