cppreference.com (Default arguments) 中的这段话是什么意思?
What does this passage from cppreference.com (Default arguments) mean?
来自 default arguments 上的 cppreference 页面:
Non-static class members are not allowed in default arguments (even if they are not evaluated), except when used to form a pointer-to-member or in a member access expression:
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;
};
我无法理解“除非用于形成指向成员的指针或在成员访问表达式中”。并且例子没有给出相关代码。
第一部分表示您可以pointer-to-member组成non-static成员之一,例如:
class X
{
int a, b;
int mem1(int X::* i = &X::a);
//...
};
A pointer-to-member 是语言中相当晦涩的部分。你可能见过成员函数指针,但你也可以像上面那样构造指向数据成员的成员指针。
成员指针不指向class当前实例的成员,需要结合.*
或->*
运算符给出对应的实例成员,例如:
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;
}
第二部分可能只是意味着可以通过通常的成员访问表达式(使用 .
或 ->
)引用 class 的另一个实例的成员.该异常不允许引用当前实例的成员,因为默认参数中也不允许 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
};
形成pointer-to-member:
int mem3(int X::*pointer_to_member = &X::a);
用在 member-access 表达式中:
X global;
int mem4(int i = global.a);
来自 default arguments 上的 cppreference 页面:
Non-static class members are not allowed in default arguments (even if they are not evaluated), except when used to form a pointer-to-member or in a member access expression:
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; };
我无法理解“除非用于形成指向成员的指针或在成员访问表达式中”。并且例子没有给出相关代码。
第一部分表示您可以pointer-to-member组成non-static成员之一,例如:
class X
{
int a, b;
int mem1(int X::* i = &X::a);
//...
};
A pointer-to-member 是语言中相当晦涩的部分。你可能见过成员函数指针,但你也可以像上面那样构造指向数据成员的成员指针。
成员指针不指向class当前实例的成员,需要结合.*
或->*
运算符给出对应的实例成员,例如:
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;
}
第二部分可能只是意味着可以通过通常的成员访问表达式(使用 .
或 ->
)引用 class 的另一个实例的成员.该异常不允许引用当前实例的成员,因为默认参数中也不允许 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
};
形成pointer-to-member:
int mem3(int X::*pointer_to_member = &X::a);
用在 member-access 表达式中:
X global;
int mem4(int i = global.a);