gpt4 book ai didi

c++ - 是否可以使用成员函数调用作为默认参数?

转载 作者:IT老高 更新时间:2023-10-28 22:19:28 28 4
gpt4 key购买 nike

这是我的代码:

struct S
{
int f() { return 1; }
int g(int arg = f()) { return arg; }
};

int main()
{
S s;
return s.g();
}

编译失败,报错:

error: cannot call member function 'int S::f()' without object

尝试 this->f() 也不起作用,因为 this 可能无法在该上下文中使用。

有没有办法让它工作,仍然使用默认参数?


当然,完全不使用默认参数也可以解决这个问题:

int g(int arg) { return arg; }
int g() { return g(f()); }

然而,考虑到在“真实代码”中 arg 之前有更多参数,以及遵循这种模式的几个函数,这就变得冗长了。 (如果一个函数中有多个默认参数,那就更丑了)。

注意。 This question一开始看起来很相似,但实际上他是在问如何形成一个闭包,这是一个不同的问题(并且链接的解决方案不适用于我的情况)。

最佳答案

只有 static 的成员才能使用。来自 C++11 标准草案 (n3299),第 8.3.6/9 节:

Similarly, a non-static member shall not be used in a default argument, even if it is not evaluated, unless it appears as the id-expression of a class member access expression (5.2.5) or unless it isused to form a pointer to member (5.3.1).

例如,这有效:

struct S {
static int f() { return 1; }
int g(int arg = f()) { return arg; }
};

int main()
{
S s;
return s.g();
}

这也有效(我认为这就是第一个表达式的意思):

struct S {
int f() { return 42; }
int g(int arg);
};

static S global;

int S::g(int arg = global.f()) { return arg; }

int main()
{
S s;
return s.g();
}

至于this,确实是不允许的(§8.3.6/8):

The keyword this shall not be used in a default argument of a member function.

default arguments cppreference.com 上的页面有很多关于这个主题的细节——它可能会变得相当复杂。

关于c++ - 是否可以使用成员函数调用作为默认参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36053305/

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