`push_back`与`emplace_back`签名警告

时间:2016-11-26 13:50:34

标签: c++ c++11 language-lawyer compiler-warnings

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

我用godbolt测试了这个,而clang 3.9.0表现出相同的行为。在任何一种情况下,gcc 6.2都不会发出警告。

由于隐式符号转换诊断不是(AFAIK)所要求的行为,我会毫不犹豫地将其称为错误,但我很好奇我是否忽略了一些解释(或复杂化)所展示行为的边缘情况。 / p>

1 个答案:

答案 0 :(得分:4)

这就像是:

之间的区别
signed a = 0;
unsigned b = a;

而且:

unsigned b = unsigned(a);

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

当你调用emplace_back()时,它完全相同 - 这个方法的全部要点是从给定的值构造 a value_type(在你的情况下是无符号的)。 / p>

同样,如果你有:

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

然后你可以这样做:

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

但不是这样:

v.push_back(1);

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