cppreference.com 中的这段话(默认参数)是什么意思?

Lan*_*ndP 5 c++ default-arguments

来自默认参数的 cppreference 页面:

默认参数中不允许使用非静态类成员(即使未对它们求值),除非用于形成指向成员的指针或在成员访问表达式中:

int b;
class X
{
    int a;
    int mem1(int i = a); // error: non-static member cannot be used
    int mem2(int i = b); // OK: lookup finds X::b, the static member
    static int b;
};
Run Code Online (Sandbox Code Playgroud)

我无法理解“除非用于形成指向成员的指针或在成员访问表达式中”。并且例子中没有给出相关代码。

use*_*522 10

第一部分意味着您可以形成指向其中一个非静态成员的成员指针,例如:

class X
{
    int a, b;
    int mem1(int X::* i = &X::a);
    //...
};
Run Code Online (Sandbox Code Playgroud)

指向成员的指针是该语言中相当晦涩的部分。您可能见过成员函数指针,但您也可以像上面那样形成指向数据成员的成员指针。

成员指针并不指向类当前实例的成员,而是需要与.*or->*运算符组合才能给出实例对应的成员,例如:

int X::mem1(int X::* i = &X::a) {
    // same as `return a;` if called with default argument
    // but if called with `mem1(&X::b)` same as `return b;`
    return this->*i; 
}
Run Code Online (Sandbox Code Playgroud)

第二部分可能只是意味着可以通过常用的成员访问表达式(使用.->)引用该类的另一个实例的成员。该异常不允许引用当前实例的成员,因为this默认参数中也不允许:

class X
{
    int a;
    static X x;
    int mem1(int i = x.a); // ok, `.` is member access
    int mem2(int i = this->a); // not ok because of `this`, but `->` is member access
};
Run Code Online (Sandbox Code Playgroud)