关于将变量传递给STL容器而不是将它们丢失到范围之外

时间:2015-11-17 21:35:24

标签: c++ c++11 stl scope

假设我们有以下代码:

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

假设dq是deque,Point是某个类。

C中的

,当foo()结束时,newpoint消失了,如果它被传递给数组,那么它就会变成垃圾,但是我在{ {1}},c++实际上在dq的范围之外保留它,是否真的在foo()上调用了复制构造函数? newpoint真正发生了什么?这是STL容器或newpoint构造函数的一个特性吗?

2 个答案:

答案 0 :(得分:5)

  

它是否真的在newpoint上调用了一个拷贝构造函数?

  

这是STL容器或C ++构造函数的一个特性吗?

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

如果您使用deque<reference_wraper<Point>>代替,则deque将包含对Point而不是Point个对象的引用,并且不会出现Point的副本。你已经明白这会导致问题,这很好。

答案 1 :(得分:1)

如您所见,push_back将复制元素或将元素移动到容器中。这个原始Point超出了函数末尾的范围,但是容器不存储对此临时文件的引用,所以它很好。