这段代码安全吗?
int main() {
struct {
int foo;
int bar;
std::list<...>::iterator it;
} foobar;
memset(&foobar, 0, sizeof(foobar));
foobar.it = ...;
}
我认为这是安全的,因为std::iterator
似乎没有覆盖operator=
。这是一个有效的推理吗?
答案 0 :(得分:7)
没有。赋值运算符通常假定其左侧(接收方)操作数在赋值之前具有有效状态。
与此同时,您正在将这些零值压缩为std::list<...>::iterator
类型的非平凡构造对象。这只能使您对std::list<...>::iterator
的确切属性有深入的了解,并且您知道用零填充它会产生有效的对象。
答案 1 :(得分:6)
memset()
任何非平凡的类型都是一个坏主意。完全没必要:只需初始化值:
struct {
int foo;
int bar;
std::list<...>::iterator it;
} foobar = {};
它具有更快的优势,也可以做正确的事情!
答案 2 :(得分:2)
你应该从不拥有构造函数的memset类型。你不知道迭代器的内部结构,所以你不应该用锤子砸它。