`push_back`与`emplace_back`标志警告
`push_back` vs. `emplace_back` sign warning
我注意到使用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。"
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 推导 std::vector::back() 的返回类型
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- C++ 警告:将新创建的 gsl::owner<> 分配给非所有者