在 C++23 中显式 *this 对象参数提供什么?
What does explicit *this object parameter offer in C++23?
在C++23中,deducing this终于加入了标准。
根据我从提案中了解到的内容,它开辟了一种创建混合宏的新方法,并且可以创建递归 lambda。
但是我很困惑,如果这个参数在没有使用模板的情况下创建了一个“副本”,因为没有引用或者显式 this
参数是否有自己的值类别规则?
开始于:
struct hello {
void func() {}
};
可能相当于:
struct hello {
void func(this hello) {}
};
但是它们的类型不同,因为对于&hello::func
,第一个给出void(hello::*)()
,而第二个给出void(*)(hello)
例如,我有这个简单的函数:
struct hello {
int data;
void func(this hello self) {
self.data = 22;
}
};
this
参数不需要引用来改变hello
类型的值吗?还是和以前一样基本遵循成员函数的cv-ref限定符规则?
本文的第 4.2.3 节提到“按值 this
”是明确允许的,并且可以满足您的期望。第 5.4 节给出了一些您希望何时执行此操作的示例。
因此在您的示例中,self
参数被修改然后销毁。调用者的 hello
对象永远不会被修改。如果要修改调用者的对象,需要引用self
:
void func(this hello& self) {
self.data = 22;
}
在C++23中,deducing this终于加入了标准。
根据我从提案中了解到的内容,它开辟了一种创建混合宏的新方法,并且可以创建递归 lambda。
但是我很困惑,如果这个参数在没有使用模板的情况下创建了一个“副本”,因为没有引用或者显式 this
参数是否有自己的值类别规则?
开始于:
struct hello {
void func() {}
};
可能相当于:
struct hello {
void func(this hello) {}
};
但是它们的类型不同,因为对于&hello::func
,第一个给出void(hello::*)()
,而第二个给出void(*)(hello)
例如,我有这个简单的函数:
struct hello {
int data;
void func(this hello self) {
self.data = 22;
}
};
this
参数不需要引用来改变hello
类型的值吗?还是和以前一样基本遵循成员函数的cv-ref限定符规则?
本文的第 4.2.3 节提到“按值 this
”是明确允许的,并且可以满足您的期望。第 5.4 节给出了一些您希望何时执行此操作的示例。
因此在您的示例中,self
参数被修改然后销毁。调用者的 hello
对象永远不会被修改。如果要修改调用者的对象,需要引用self
:
void func(this hello& self) {
self.data = 22;
}