假设我们有以下代码:
void foo()
{
Point newpoint(...);
dq.push_back(newpoint);
...
return dq;
}
假设dq
是deque,Point
是某个类。
C
中的,当foo()
结束时,newpoint
消失了,如果它被传递给数组,那么它就会变成垃圾,但是我在{ {1}},c++
实际上在dq
的范围之外保留它,是否真的在foo()
上调用了复制构造函数? newpoint
真正发生了什么?这是STL容器或newpoint
构造函数的一个特性吗?
答案 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
超出了函数末尾的范围,但是容器不存储对此临时文件的引用,所以它很好。