假设我们有以下代码:

void foo()
{
        Point newpoint(...);
        dq.push_back(newpoint);
        ...
        return dq;
}


假设dq是双端队列,Point是某个类。

C中,当foo()结束时,然后newpoint消失了,例如,如果将其传递给数组,它将变成垃圾,但是我看到在c++中,dq实际上保留了它当它超出foo()的范围时,它是否实际上在newpoint上调用了副本构造函数? newpoint真正发生了什么?这是STL容器或C++的构造函数的功能吗?

最佳答案

它实际上在newpoint上调用了副本构造函数吗?


是。


  这是STL容器或C ++构造函数的功能吗?


元素类型为T的STL容器始终包含T对象,而不是指向T或指向T的指针。从类型T的表达式初始化类型为T的对象时,将执行复制或移动。

如果改用deque<reference_wraper<Point>>,则双端队列将包含对Point的引用,而不是Point对象,并且不会出现Point的副本。很好,您已经了解这将如何导致问题。

关于c++ - 关于将变量传递到STL容器而不会超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33767456/

10-10 23:43