我正在阅读c ++ 14 N3797,我遇到了3.3.7/1:
如果类中的重新排序成员声明在(1)和(2)下产生备用有效程序,则程序格式错误,不需要诊断.
有(1)和(2):
1)在类中声明的名称的潜在范围不仅包括名称声明点后面的声明性区域,还包括所有函数体,默认参数,异常规范和非支撑或等于初始值的声明区域.该类中的静态数据成员(包括嵌套类中的这些内容).
2)在S类中使用的名称N应在其上下文中引用相同的声明,并在完成的S范围内重新评估.违反此规则不需要诊断.
那就是我们写下面的内容:
class A
{
int a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
然后该计划形成不良.重新成员声明会产生一个备用的有效程序:
class A
{
int b;
int a;
}
Run Code Online (Sandbox Code Playgroud)
我可能不正确理解这个规则吗?
请考虑[namespace.memdef]/3中的以下子句:
如果
friend声明中的名称既不是限定名也不是模板标识,并且声明是函数或详细类型说明符,则确定实体是否先前已声明的查找不应考虑最内层封闭命名空间之外的任何范围.
是否有理由将template-id与限定名称一起使用?就此而言,是否有理由查找非限定为最内层封闭命名空间的模板ID的非限定名称?是否存在本条款解决的特定问题或用例?