我注意到在使用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>
答案 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。”