Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我下面关于§的观察是否正确;C&x2B中的9.3.1/3+;标准_C++_C++11_Language Lawyer - Fatal编程技术网

C++ 我下面关于§的观察是否正确;C&x2B中的9.3.1/3+;标准

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的基类,则类 成员访问表达式格式错误-结束注释]在

§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的基类,那么类成员访问表达式的格式就不正确。”


请注意,如果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年