`push_back`与`emplace_back`标志警告

`push_back` vs. `emplace_back` sign warning

本文关键字:back 警告 标志 emplace push      更新时间:2023-10-16

我注意到使用Apple的clang-版本(703.0.31) - 通过push_back方法将[signed] int推到std::vector<unsigned int>上的方法会引起有关隐式符号转换的警告。鉴于警告标志,我对此感到满意,但惊讶于用emplace_back方法替换它没有产生警告。

我用Godbolt对此进行了测试,Clang 3.9.0表现出相同的行为。GCC 6.2在两种情况下均不发出警告。

由于隐含的符号转换诊断不是(AFAIK)所需的行为,所以我会毫不犹豫地称其为错误,但是我很好奇我是否忽略了某些边缘案例可以解释(或复杂化!)展览行为。/p>

这就像以下区别:

signed a = 0;
unsigned b = a;

和此:

unsigned b = unsigned(a);

后者是阻止这种警告发生的典型方法(另一种方式是演员)。

当您调用 emplace_back()时,完全相同 - 此方法的全部要点是 construct a value_type(在您的情况下未签名)。

同样,如果您有:

struct Foo { explicit Foo(int x) {} };

然后您可以这样做:

std::vector<Foo> v;
v.emplace_back(1);

但不是这个:

v.push_back(1);

总而言之,emplace_back()的含义不是" push_back(),而是更高效"。相反,它是"使用这些参数,在容器内构建Value_type。"