【问题标题】:C++ vector push_back empty bracesC++ 向量 push_back 空大括号
【发布时间】:2021-05-26 21:38:20
【问题描述】:

我见过类似的代码

struct A {
  int m;
};

vector<A> vec;
vec.push_back({});

我的问题是: vec.push_back({});vec.push_back(A{}) 有什么区别?为什么我们可以在A{} 中省略A

【问题讨论】:

  • 添加一个带有 vec.emplace_back() 的版本以获得乐趣。

标签: c++ c++11 c++14


【解决方案1】:

vec.push_back({});vec.push_back(A{}) 有什么区别?

在这种情况下,没有。

为什么我们可以在A{} 中省略A

您正在实例化 vector 以保存 A 元素。因此其重载的push_back() 方法将接受const A&amp;A&amp;&amp; 输入参数。现代 C++ 标准提供了initialization rules,让编译器推断在这些上下文中使用的{} 将构造一个A 对象,这就是为什么您不需要在A{} 中显式指定类型的原因。

仅供参考,vector 也有您应该使用的 emplace_back() 方法,而不是推送一个空的 {}

vector<A> vec;
vec.emplace_back();

【讨论】:

  • 我不会说代替。 Push 和 emplace 有不同的用途,应该相应地使用。
  • @sweenish 当然,但是在这个例子中,使用push_back({}) 比使用emplace_back() 没有任何好处
  • 这是一个重要的警告,在这个例子中。我见过人们提倡将 emplace 作为批发替代品。它在 C++ 博客圈子中并非不受欢迎。当然,在大多数情况下这可能是有道理的,但我看到太多帖子中人们给出糟糕的建议只是为了让他们的标题更容易点击。
  • @sweenish vector::emplace 不应该与容器的成员一起调用,因为它不支付处理费用。我不认为还有什么有趣的...
  • @Deduplicator 你能解释一下“vector::emplace 不应该用容器的成员调用”吗?你的意思是我们不应该这样做vec.emplace(vec.end(), anotherVec[5])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2011-12-08
  • 2014-09-13
  • 2014-05-31
  • 2013-03-28
  • 2011-05-17
相关资源
最近更新 更多