1

可能重复:
非静态成员作为非静态成员函数的默认参数
为什么不能将成员变量用作参数的默认值?

好的,如果我在这里没有看到非常简单的东西或忘记了 C++ 的一些基本规则,我提前道歉,但我不确定为什么这不能按预期工作。

这是我无法工作的代码示例

class Foo
{
private:
    Bar *ptrBar;
public:
    void doSomething(int x, Bar *p = ptrBar);
}

编译器对此函数的默认参数有问题。有什么原因导致这行不通。

基本上 doSomething 会对 Bar 对象进行一些操作,我希望它是默认情况下 ptrBar 指向的那个。除非我忘记了什么,否则一切似乎都很正常?

4

2 回答 2

5

不允许使用类成员作为默认参数,也不允许this.

8.3.6 默认参数 [dcl.fct.default]

[...] 类似地,一个非静态成员不得在默认参数中使用,即使它没有被评估,除非它作为类成员访问表达式 (5.2.5) 的 id 表达式出现,或者除非它用于形成指向成员(5.3.1)的指针。[...]

最好的解决方法是使用重载:

class Foo
{
private:
    Bar *prtBar;
public:
    void doSomething(int x, Bar *p);
    void doSomething(int x)
    {
        soSomething(x, ptrBar);
    }
}
于 2012-12-16T07:32:44.473 回答
1

在编译器对此进行评估时,ptrBar未设置。因此,您的默认参数没有默认值。

为什么不使用默认值 null 并且如果pindoSomething()为 null 则使用该ptrBar成员。

于 2012-12-16T07:33:20.463 回答