C++ 关于将变量传递到STL容器并不会将其丢失到范围之外

C++ 关于将变量传递到STL容器并不会将其丢失到范围之外,c++,c++11,stl,scope,C++,C++11,Stl,Scope,假设我们有以下代码: void foo() { Point newpoint(...); dq.push_back(newpoint); ... return dq; } 假设dq是deque,Point是某个类 在C中,当foo()结束时,newpoint就消失了,例如,如果它被传递到一个数组中,它就会变成垃圾,但我看到在C++中,dq实际上在它超出foo()的范围时保留了它,它是否真的在newpoint上调用了复制构造函数?n

假设我们有以下代码:

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

它是否真的在
newpoint
上调用了复制构造函数

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

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


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

如您所见,将复制元素或将元素移动到容器中。此原始
超出了函数末尾的范围,但容器未存储对该临时点的引用,因此没有问题。

如您所见,将复制元素或将元素移动到容器中。这个原始的
点在函数结束时超出了范围,但是容器没有存储对这个临时点的引用,所以它很好。

是的,STL容器通常会在这种情况下执行一个副本。更大的问题是如何从
void foo()
:)返回
deque
。@Praetorian lol,哎呀。
newpoint
不见了,但这并不重要,因为
newpoint
没有存储在数据块中,只有另一个恰好具有相同值的点。在C中也是一样的。是的,STL容器通常会在这种情况下执行一个副本。更大的问题是如何从
void foo()
:)@Praetorian lol,oops返回
newpoint
,但这并不重要,因为
newpoint
没有存储在deque中,只有另一个恰好具有相同值的点。在C中也是一样的。