如何调用成员初始化列表中的函数?
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
一个定义的值。
我在 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
一个定义的值。