关于将变量传递到STL容器并且不会在范围外丢失它们

About passing variables to STL containers and not losing them out of scope

本文关键字:范围 变量 STL      更新时间:2023-10-16

假设我们有以下代码:

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

假设dq是deque,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>>,则deque将包含对Point而不是Point对象的引用,并且不会出现Point的副本。很高兴你已经了解了这将如何导致问题。

正如您所看到的,push_back将复制元素或将元素移动到容器中。这个原始的Point在函数末尾超出了作用域,但容器没有存储对这个临时的引用,所以没关系。