在分配之前,memset()是一个std :: iterator变量是否安全?

ant*_*tak 1 c++ std

这段代码安全吗?

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=.这是一个有效的推理吗?

AnT*_*AnT 7

否.赋值运算符通常假定其左侧(接收方)操作数在赋值之前具有有效状态.

与此同时,您正在将这些零值压缩为可能非平凡构造的std::list<...>::iterator类型对象.这只能使你对你的确切属性有深入的了解,std::list<...>::iterator并且你知道用零填充它会产生一个有效的对象.


Die*_*ühl 6

memset()任何非平凡的类型都是一个坏主意.完全没必要:只需初始化值:

struct {
    int foo;
    int bar;
    std::list<...>::iterator it;
} foobar = {};
Run Code Online (Sandbox Code Playgroud)

它具有明显的优点:更快,也做正确的事!