为什么这不能作为成员函数中的默认参数传递?

Abh*_*pta 5 c++

我试图将当前长度值作为默认参数作为函数参数传递.但编译器显示错误

"'这个'可能不会在这种情况下使用"

任何人都可以告诉我我犯的错误是什么.?

class A
{

    private:
    int length;
    public:
    A();
    void display(int l=this->length)
    {
        cout<<"the length is "<<l<<endl;
    }

};


int main()
{

    A a;
    a.display();    
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 14

您的会员功能:

void display(int l=this->length)
Run Code Online (Sandbox Code Playgroud)

在概念上等同于:

void display(A * this, int l=this->length); //translated by the compiler
Run Code Online (Sandbox Code Playgroud)

这意味着,你在表达式中使用一个参数,这是C++中不允许的其他参数的默认参数,如§8.3.6/ 9(C++ 03)所述,

每次调用函数时都会计算默认参数.函数参数的评估顺序未指定.因此,函数的参数不应在默认参数表达式中使用,即使它们未被计算.

请注意,C++不允许这样:

int f(int a, int b = a); //illegal : §8.3.6/9
Run Code Online (Sandbox Code Playgroud)

解决方案是添加一个不带参数的重载:

void display()
{
    display(length); //call the other one!
}
Run Code Online (Sandbox Code Playgroud)

如果您不想再添加一个函数,请为参数选择一个不可能的默认值.例如,因为它描述了永远不会为负的长度,那么您可以选择-1默认值,并且可以将您的函数实现为:

void display(int l = -1)
{
      if ( l <= -1 ) 
           l = length; //use it as default value!
      //start using l 
}
Run Code Online (Sandbox Code Playgroud)

  • 我完全支持这个答案.+1 (2认同)