c++标准的3.4.3.1节中有这个语句的一个例子

An example for this statement in section 3.4.3.1 of the C++ standard?

本文关键字:语句 一个 标准 1节 c++      更新时间:2023-10-16

谁能贴一个有用的例子来说明(1.4)。

如果限定id的嵌套名称说明符指定了一个类,那么在嵌套名称说明符之后指定的名称将在类的作用域中查找(10.2),下面列出的情况除外。名称应代表该类或其基类之一的一个或多个成员(第10条)。[注:类成员可以在其潜在作用域中的任何点使用限定id引用(3.3.7)。]上述名称查找规则的例外情况如下:

(1.1) -按

中指定的方式查找析构函数名

(1.2)——转换函数id的转换类型id的查找方式与类成员中的转换类型id的查找方式相同访问(见3.4.5);

(1.3)—template-id的模板参数中的名称在整个后缀表达式出现的上下文中查找。

(1.4) -查找在using声明(7.3.3)中指定的名称也可以找到隐藏在同一作用域(3.3.10)中的类或枚举名称。

这是CWG 400(引用N0905)的决议,该决议质疑以下代码是否格式良好:

struct A { int i; struct i {}; };
struct B { int i; struct i {}; };
struct D : public A, public B { using A::i; void f (); };
void D::f () { struct i x; }
在标准中增加了项目符号,以明确using A::i struct i { } int i带入D,从而使struct i x格式良好。

我没有检查引号,但我认为这个例子将是相关的

#include <iostream>
namespace N1
{    
struct A
{
    static int x;
};
}    
using N1::A;
int x = 10;
int N1::A::x = 20;
int A = 30;
int main()
{
    std::cout << A::x << std::endl;
}    

程序输出为

20

在同一作用域中的是二义的。因此,您可以考虑修改后的示例

#include <iostream>
namespace N1
{    
struct A
{
    static int x;
};
int A = 30;
}    
using N1::A;
int x = 10;
int N1::A::x = 20;
int main()
{
    std::cout << A::x << std::endl;
}    
在这两个程序中,int 类型的对象A的声明
int A = 30;

隐藏struct A的声明

相关文章: