这段代码安全吗?
int main() {
struct {
int foo;
int bar;
std::list<...>::iterator it;
} foobar;
memset(&foobar, 0, sizeof(foobar));
foobar.it = ...;
}
Run Code Online (Sandbox Code Playgroud)
我认为它是安全的,因为std::iterator似乎没有覆盖operator=.这是一个有效的推理吗?
否.赋值运算符通常假定其左侧(接收方)操作数在赋值之前具有有效状态.
与此同时,您正在将这些零值压缩为可能非平凡构造的std::list<...>::iterator类型对象.这只能使你对你的确切属性有深入的了解,std::list<...>::iterator并且你知道用零填充它会产生一个有效的对象.
memset()任何非平凡的类型都是一个坏主意.完全没必要:只需初始化值:
struct {
int foo;
int bar;
std::list<...>::iterator it;
} foobar = {};
Run Code Online (Sandbox Code Playgroud)
它具有明显的优点:更快,也做正确的事!
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |