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中也是一样的。