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

shi*_*zou 0 c++ scope stl c++11

假设我们有以下代码:

void foo()
{
        Point newpoint(...);
        dq.push_back(newpoint);
        ...
        return dq;
}
Run Code Online (Sandbox Code Playgroud)

假设dq是deque,Point是一些类.

in C,当foo()结束时,然后newpoint就消失了,如果它被传递给一个数组,例如,它会变成垃圾,但我看到它c++,dq实际上当它超出foo()范围时保留它,它实际上是否调用了一个复制构造函数在newpoint?真的发生了newpoint什么?这是STL容器或C++构造函数的特征吗?

Bri*_*ian 5

它实际上是否调用了复制构造函数newpoint

是.

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

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

如果你使用了,deque<reference_wraper<Point>>那么deque将包含对象Point而不是Point对象的引用,并且不会Point发生任何副本.你已经明白这会导致什么问题,这很好.