在初始化列表中调用私有函数的情况下,它是未定义的行为吗?

Ale*_*tov 5 c++ constructor const undefined-behavior

请考虑以下代码:

struct Calc
{
   Calc(const Arg1 & arg1, const Arg2 & arg2, /* */ const ArgN & argn) :
      arg1(arg1), arg2(arg2), /* */ argn(argn), 
      coef1(get_coef1()), coef2(get_coef2()) 
   {
   }

   int Calc1();
   int Calc2();
   int Calc3();

private:
  const Arg1 & arg1;
  const Arg2 & arg2;
  // ...
  const ArgN & argn;

  const int coef1; // I want to use const because 
  const int coef2; //      no modification is needed.

  int get_coef1() const {
     // calc coef1 using arg1, arg2, ..., argn;
     // undefined behavior?     
  }
  int get_coef2() const {
     // calc coef2 using arg1, arg2, ..., argn and coef1;
     // undefined behavior?
  }

};
Run Code Online (Sandbox Code Playgroud)

struct Calc当我打电话时没有完全确定get_coef1,并get_coef2 是该代码有效?我可以获得UB吗?

Tad*_*pec 8

12.6.2.8:可以为正在构建的对象调用成员函数(包括虚拟成员函数,10.3).类似地,正在构造的对象可以是typeid运算符(5.2.8)或dynamic_cast(5.2.7)的操作数.但是,如果在基类的所有mem-initializer完成之前,在ctor-initializer(或直接或间接从ctor-initializer调用的函数)中执行这些操作,则操作的结果是不确定的.

因此,您可以通过这种方式初始化类成员,但不能基类.并且,正如其他人指出的那样,如果您的函数使用了某些值,您应该知道成员初始化顺序.