c++ - [expr.ref]/1 中提到的脚注到底是什么意思?

标签 c++ language-lawyer member-access

[expr.ref]/1 :

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

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

最佳答案

如果一个成员被定义为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

关于c++ - [expr.ref]/1 中提到的脚注到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44529581/

相关文章:

c++ - 多次复制和粘贴

java - 编译器生成的默认构造函数会公开吗?

c++ - 在 Win32 API ListView 中添加带换行符的文本

c++ - 如何用ncurses画一条线?

C++ “was not declared in this scope” 编译错误

c - 使用(void **)传递(double ***)指针可以吗?

c++ - 对临时对象成员的 const 引用

c++ - 在普通对象安全的任何上下文中,原子对象是否不安全?

c# - C# 编译器是否将 Color Color 规则错误地用于 const 类型成员?

r - 是否有一致的方法来强制错误列表或向量索引出错