如何调用成员初始化列表中的函数?

How to call a function in a member initialization list?

我在 jpeg_decompress_struct (ijg/libjpeg-turbo) 周围有以下简单的 c++(RAII 模式)包装器:

class Decompress {
  typedef jpeg_decompress_struct *ptr;
  jpeg_decompress_struct srcinfo;

 public:
  Decompress() { jpeg_create_decompress(&srcinfo); }
  ~Decompress() { jpeg_destroy_decompress(&srcinfo); }
  operator ptr() { return &srcinfo; }
  jpeg_decompress_struct *operator->() { return &srcinfo; }
};

我对这段代码很满意,我想保持 srcinfo 现在的状态(在堆栈上,就像上游 expect it 一样)

有没有办法使用成员初始化列表重写上述构造函数?我想通过 gcc -Weffc++.

的检查

当前警告是:

jpeg.cxx:92:3: error: ‘acme::Decompress::srcinfo’ should be initialized in the member initialization list [-Werror=effc++]
   92 |   Decompress() { jpeg_create_decompress(&srcinfo); }
      |   ^~~~~~~~~~

如果(我们在这里可以安全地假设)jpeg_create_decompress() 可以对包含未定义值的 jpeg_decompress_struct 进行操作,那么您发布的代码就可以了。我不会亲自去碰它。

不过,问题还是可以按要求回答的:

大多数表述为“如何在初始化列表中执行 __blank__”的问题都有相同的答案:在函数中执行。

jpeg_decompress_struct make_initialized_jds() {
  jpeg_decompress_struct result;
  jpeg_create_decompress(&result);
  return result;
}

class Decompress {
  typedef jpeg_decompress_struct *ptr;
  jpeg_decompress_struct srcinfo;

 public:
  Decompress() : srcinfo(make_initialized_jds()) {}
  ~Decompress() { jpeg_destroy_decompress(&srcinfo); }
  operator ptr() { return &srcinfo; }
  jpeg_decompress_struct *operator->() { return &srcinfo; }
};

在使用 NRVO 的现代编译器中,这甚至不会导致任何额外的开销。

编辑: 来自更新后的问题:如果您只是想让警告消失,您可以使用成员初始化显式零初始化结构:

class Decompress {
  jpeg_decompress_struct srcinfo = {0};          // <---- here
  typedef jpeg_decompress_struct *ptr = nullptr; // <---- might as well...

 public:
  Decompress() { jpeg_create_decompress(&srcinfo); }
  ~Decompress() { jpeg_destroy_decompress(&srcinfo); }
  operator ptr() { return &srcinfo; }
  jpeg_decompress_struct *operator->() { return &srcinfo; }
};

这将在调用 jpeg_create_decompress() 之前给 srcinfo 一个定义的值。