首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量emplace_back混淆

向量emplace_back混淆
EN

Stack Overflow用户
提问于 2014-06-03 13:34:13
回答 1查看 175关注 0票数 2

我对这个代码片段的输出很好奇。

代码语言:javascript
复制
#include <vector>
#include <iostream>

struct base
{
  static int id;
  base() {std::cout << "C" << std::endl; mid = id; id++;}
  //base(const base&) {std::cout << "Co" << std::endl;}
  //base(base &&) {std::cout << "Mo" << std::endl;}
  ~base() {std::cout << "D" << mid << std::endl;}
  int mid;
};

int base::id = 0;

int main()
{
  std::vector<base> v;
  v.emplace_back();
  std::cout << "First" << std::endl;
  v.emplace_back();
  std::cout << "Second" << std::endl;
}

g++ 4.7.2显示了输出

代码语言:javascript
复制
C
First
C
D0
Second
D0
D1

我不明白为什么"D0“出现在第二个"C”之后。此外,为什么在输出中出现两次"D0“?

这种行为是否符合C++11标准,还是与“实现质量”相关?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-03 13:41:32

在添加对象时,vector正在调整大小。reserve在开始时有足够的空间,您将看到所期望的输出。

代码语言:javascript
复制
std::vector<base> v;
v.reserve(2);        // now there's enough capacity to contain at least 2 objects
v.emplace_back();
std::cout << "First" << std::endl;
v.emplace_back();
std::cout << "Second" << std::endl;

输出:

代码语言:javascript
复制
C
First
C
Second
D0
D1

现场演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24016590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档