gpt4 book ai didi

c++ - 非静态成员作为非静态成员函数的默认参数

转载 作者:IT老高 更新时间:2023-10-28 12:46:50 25 4
gpt4 key购买 nike

struct X
{
X():mem(42){}
void f(int param = mem) //ERROR
{
//do something
}
private:
int mem;
};

谁能告诉我为什么这在 C++ 中是非法的?!也就是说,我知道这是一个错误,我知道这个错误是什么意思,我就是不明白为什么这是非法的!

最佳答案

您的代码(简化版):

struct X
{
int mem;
void f(int param = mem); //ERROR
};

您想使用非静态成员数据作为成员函数参数的默认值。想到的第一个问题是:默认值mem属于类的哪个具体实例

X x1 = {100};  //mem = 100
X x2 = {200}; //mem = 200

x1.f(); //param is 100 or 200? or something else?

您的答案可能是 100 因为 f() 是在具有 mem = 100 的对象 x1 上调用的>。如果是这样,那么它需要实现将 f() 实现为:

void f(X* this, int param = this->mem);

这反过来要求在初始化其他参数之前首先初始化第一个参数。但是 C++ 标准没有指定函数参数的任何初始化顺序。因此这是不允许的。出于同样的原因,C++ 标准甚至不允许这样做:

int f(int a, int b = a); //§8.3.6/9

事实上,§8.3.6/9 明确表示,

Default arguments are evaluated each time the function is called. The order of evaluation of function arguments is unspecified. Consequently, parameters of a function shall not be used in default argument expressions, even if they are not evaluated.

这部分的其余部分很有趣。


一个与“默认”参数相关的有趣话题(虽然与这个话题无关):

关于c++ - 非静态成员作为非静态成员函数的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4539406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com