Nonstatic member as a default argument of a nonstatic member function

后端 未结 9 1057
攒了一身酷
攒了一身酷 2020-11-28 05:56
struct X
{
   X():mem(42){}
   void f(int param = mem) //ERROR
   {
      //do something
   }
private: 
   int mem;
};

Can anyone give me just one

9条回答
  •  自闭症患者
    2020-11-28 06:20

    Your code (simplified):

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

    You want to use a non-static member data as default value for a parameter of a member function. The first question which comes to mind is this : which specific instance of the class the default value mem belongs to?

    X x1 = {100};  //mem = 100
    X x2 = {200};  //mem = 200
    
    x1.f(); //param is 100 or 200? or something else?
    

    Your answer might be 100 as f() is invoked on the object x1 which has mem = 100. If so, then it requires the implementation to implement f() as:

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

    which in turn requires the first argument to be initialized first before initialization of other argument. But the C++ standard doesn't specify any initialization order of the function arguments. Hence that isn't allowed. Its for the same reason that C++ Standard doesn't allow even this:

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

    In fact, §8.3.6/9 explicitly says,

    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.

    And rest of the section is an interesting read.


    An interesting topic related to "default" arguments (not related to this topic though):

    • Default argument in the middle of parameter list?

提交回复
热议问题