【问题标题】:About passing variables to STL containers and not losing them out of scope关于将变量传递给 STL 容器并且不丢失它们超出范围
【发布时间】:2016-02-19 10:40:33
【问题描述】:

假设我们有以下代码:

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

假设dq 是双端队列,Point 是某个类。

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

【问题讨论】:

  • 是的,在这种情况下,STL 容器通常会执行复制。
  • 更大的问题是您如何设法从void foo() 返回deque :)
  • @Praetorian 哈哈,哎呀。
  • newpoint 消失了,但这没关系,因为newpoint 没有存储在双端队列中,只是另一个点恰好具有相同的值。在 C 中也是如此。

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


【解决方案1】:

如您所见,push_back 将复制元素或将元素移动到容器中。这个原始的Point 在函数末尾超出范围,但容器没有存储对这个临时的引用,所以没关系。

【讨论】:

    【解决方案2】:

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

    是的。

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

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

    如果您改用deque<reference_wraper<Point>>,则双端队列将包含对Point 的引用而不是Point 对象,并且不会出现Point 的副本。很高兴您已经了解这将如何导致问题。

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多