【问题标题】:What exactly is the meaning of the footnote mentioned in [expr.ref]/1?[expr.ref]/1 中脚注的具体含义是什么?
【发布时间】:2017-06-13 19:02:09
【问题描述】:

[expr.ref]/1:

后缀表达式后跟一个点 . 或箭头 ->,可选地后跟关键字 template (17.2), 后跟一个id-expression,是一个后缀表达式。点或箭头前的后缀表达式 被评估;67 评估的结果与 id-expression 一起确定 整个后缀表达式。

67) 如果对类成员访问表达式求值,则子表达式求值发生,即使结果是不必要的 确定整个后缀表达式的值,例如如果 id-expression 表示静态成员。

【问题讨论】:

    标签: c++ language-lawyer member-access


    【解决方案1】:

    如果一个成员被定义为static,那么该类只有一个该成员的副本,而不是该类的每个实例都有一个副本。静态成员可以通过类的实例(对象)来引用。脚注阐明了标识实例的表达式已被求值(并且会发生任何副作用),即使您不需要知道您正在访问哪个实例对象即可知道静态成员的值。

    一个例子:

    #include <iostream>
    
    class foo {
        public:
            static int s;
    };
    
    int foo::s = 42;
    
    int index() {
        std::cout << "index returns 5\n";
        return 5;
    }
    
    int main() {
        foo arr[10];
        std::cout << arr[index()].s << "\n";
    }
    

    只有一个s 对象,其值为42,但仍会计算表达式arr[index()],即使确定s 的值不需要其结果。

    输出是:

    index returns 5
    42
    

    【讨论】:

      猜你喜欢
      • 2011-11-18
      • 2015-08-02
      • 2012-02-24
      • 1970-01-01
      • 2011-09-17
      • 2018-07-19
      相关资源
      最近更新 更多