首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`push_back`与`emplace_back`签名警告

`push_back`与`emplace_back`签名警告
EN

Stack Overflow用户
提问于 2016-11-26 13:50:34
回答 1查看 267关注 0票数 1

我注意到,当使用苹果的conversion (703.0.31)时,通过[signed] int方法将一个std::vector<unsigned int>推到std::vector<unsigned int>上会引发关于隐式符号转换的警告。考虑到警告标志,我对此感到满意,但惊讶的是,用emplace_back方法替换它并没有产生警告。

我用哥德波特对此进行了测试,clang3.9.0也显示了相同的行为。在这两种情况下,gcc 6.2都不会产生警告。

由于隐式符号转换诊断不是(AFAIK)所必需的行为,我不愿称它为bug,但我很好奇是否忽略了解释(或复杂!)的边缘情况!表现出来的行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-26 13:57:00

就像这两者之间的区别:

代码语言:javascript
复制
signed a = 0;
unsigned b = a;

这是:

代码语言:javascript
复制
unsigned b = unsigned(a);

后者是阻止此类警告发生的典型方法(另一种方式是强制转换)。

在调用emplace_back()时完全一样--这个方法的全部目的是从给定的值构造一个value_type (在您的情况下没有签名)。

同样,如果您有:

代码语言:javascript
复制
struct Foo { explicit Foo(int x) {} };

然后你就可以这样做:

代码语言:javascript
复制
std::vector<Foo> v;
v.emplace_back(1);

但不是这个:

代码语言:javascript
复制
v.push_back(1);

总之,emplace_back()的含义不是"push_back(),而是更高效“。相反,它是“使用这些参数在容器中构造一个value_type”。

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

https://stackoverflow.com/questions/40819022

复制
相关文章

相似问题

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