C++ 我下面关于§的观察是否正确;C&x2B中的9.3.1/3+;标准
§9.3.1/3(重点是我的): 当id表达式(5.1)不是类成员访问的一部分时 语法(5.2.5)和不用于形成指向成员(5.3.1)的指针 在类X的成员中使用,在该上下文中可以使用 (5.1.1),如果名称查找(3.4)解析id表达式中的名称 对于某个类C的非静态非类型成员,如果 id表达式可能被计算为或C是X或X的基类, id表达式转换为类成员访问表达式 (5.2.5)使用(*this)(9.3.2)作为 这个操作人员[注意:如果C不是X或X的基类,则类 成员访问表达式格式错误-结束注释]在 名称查找,当在名称的定义中使用非限定id(5.1)时 类X的成员函数解析为静态成员,即枚举数 或类X的嵌套类型或基类X的嵌套类型 不合格id转换为合格id(5.1),其中 嵌套名称说明符命名成员函数的类 上面的注释不应该更具体一些吗?我的意思是这样的:`如果id表达式可能被计算,并且如果C不是X或X的基类,那么类成员访问表达式的格式就不正确。”C++ 我下面关于§的观察是否正确;C&x2B中的9.3.1/3+;标准,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,§9.3.1/3(重点是我的): 当id表达式(5.1)不是类成员访问的一部分时 语法(5.2.5)和不用于形成指向成员(5.3.1)的指针 在类X的成员中使用,在该上下文中可以使用 (5.1.1),如果名称查找(3.4)解析id表达式中的名称 对于某个类C的非静态非类型成员,如果 id表达式可能被计算为或C是X或X的基类, id表达式转换为类成员访问表达式 (5.2.5)使用(*this)(9.3.2)作为 这个操作人员[注意:如果C不是X或X的基类,则类 成员访问表达式格式错误-结束注释]在
请注意,如果id表达式是一个未赋值的操作数,即使C不是X,也不是X的基类,代码仍然有效,尽管在这种情况下,段落中提到的转换不会发生。注释有点含糊不清,但我认为它是上一句最后一部分的注释,就好像它是书面形式为: 如果id表达式可能被计算,或者C是X或X的基类,那么:
- id表达式转换为类成员访问表达式(5.2.5),使用(*this)(9.3.2)作为.operator左侧的后缀表达式。[注意:如果C不是X或X的基类,则类成员访问表达式的格式不正确。-结束注释]
无论如何,注释不是规范的,所以即使措辞留下了怀疑的余地,它也没有什么关系,因为它对任何C++程序或实现都没有任何影响:因为这个注释的措辞没有程序是有效的或无效的,并且由于这个注释,没有实现一致或不符合。在这里,理解标准变得更加困难,导致误解
正如Columbo在评论中提到的那样,实施者的这种误解可能会导致不一致的实施,但这不是这里发生的事情。注释有点含糊不清,但我认为它是针对前一句最后一部分的注释,好像它被写为: 如果id表达式可能被计算,或者C是X或X的基类,那么:
- id表达式转换为类成员访问表达式(5.2.5),使用(*this)(9.3.2)作为.operator左侧的后缀表达式。[注意:如果C不是X或X的基类,则类成员访问表达式的格式不正确。-结束注释]
无论如何,注释不是规范的,所以即使措辞留下了怀疑的余地,它也没有什么关系,因为它对任何C++程序或实现都没有任何影响:因为这个注释的措辞没有程序是有效的或无效的,并且由于这个注释,没有实现一致或不符合。在这里,理解标准变得更加困难,导致误解
正如Columbo在评论中提到的,实现者的这种误解可能会导致不一致的实现,但这里并不是这样。注释基本上意味着,如果使用
C::member
作为变量(而不仅仅是确定其类型、对齐方式或大小)这个计划显然形式不好
例如
class C
{
int member;
};
class X
{
void memfun()
{
// Note that 'this' can be used here
C::member = 3; // member is potentially evaluated ([basic.def.odr]/2).
// Thus the expression is transformed into
// (*this).member
// which is clearly ill-formed.
}
};
程序的格式不正确,因为成员
与X
没有任何“关系”(它不是X
或其任何基类的成员),并且可能会对其进行评估。该报价是适当的(尽管是多余的) 然而,为什么
sizeof(C::member)
不是格式错误的呢?因为C::member
没有潜在的评估
除非表达式是未计算的表达式,否则可能会对其进行计算
操作数(第5条)或其子表达式
和[expr.sizeof]:
操作数是一个表达式,,它是一个未赋值的
操作数(第5条),或括号中的type-id
因此,id表达式不会被转换。注释基本上意味着,如果将
C::member
用作变量(而不仅仅是确定其类型、对齐方式或大小),则程序显然格式不正确
例如
class C
{
int member;
};
class X
{
void memfun()
{
// Note that 'this' can be used here
C::member = 3; // member is potentially evaluated ([basic.def.odr]/2).
// Thus the expression is transformed into
// (*this).member
// which is clearly ill-formed.
}
};
程序的格式不正确,因为成员
与X
没有任何“关系”(它不是X
或其任何基类的成员),并且可能会对其进行评估。该报价是适当的(尽管是多余的) 然而,为什么
sizeof(C::member)
不是格式错误的呢?因为C::member
没有潜在的评估
除非表达式是未计算的表达式,否则可能会对其进行计算
操作数(第5条)或其子表达式
和[expr.sizeof]:
操作数是一个表达式,,它是一个未赋值的
操作数(第5条),或括号中的type-id
因此,id表达式没有被转换。所以这个注释来自于2005年和2005年