如何检测 std::vector::emplace_back 上的隐式转换损失整数精度
How to detect implicit conversion losses integer precision on std::vector::emplace_back
我使用编译器选项编译了以下代码-Wconversion
以检测隐式转换丢失整数精度:
#include <vector>
#include <cstdint>
int main() {
std::vector<std::uint16_t> v;
std::uint32_t a = 0;
v.emplace_back(a); // no warning
v.push_back(a); // warning: implicit conversion loses integer precision
}
编译演示 https://wandbox.org/permlink/K5E4sUlfGBw6C5w8
向量的value_type
是std::uint16_t
。 如果我push_back
std::uint32_t
向量的值,那么我如预期的那样收到以下警告。
prog.cc:8:17: warning: implicit conversion loses integer precision: 'std::uint32_t' (aka 'unsigned int') to 'std::__1::vector<unsigned short, std::__1::allocator<unsigned short> >::value_type' (aka 'unsigned short') [-Wimplicit-int-conversion]
v.push_back(a); // warning: implicit conversion loses integer precision
~~~~~~~~~ ^
1 warning generated.
但是,如果我对向量emplace_back
相同的值,则不会检测到警告。
我已经测试了它 clang++ 10.0.0、clang++ 9.0.0 和 g++ 9.3.0 并得到了相同的结果。
有没有好的方法可以检测 std::vector::emplace_back 上的隐式转换损失整数精度?
调用v.emplace_back(a)
时没有隐式转换。如果您调用v.emplace_back<const std::uint16_t &>(a)
,则会有一个隐式转换。
push_back
和emplace_back
之间的主要区别在于后者是模板,而前者不是。如果不为emplace_back
指定模板参数,编译器将从函数参数推导它,这意味着在调用时不需要转换。在emplace_back
内,转换发生在系统标头中,这会禁止显示警告。
所以在你的例子中,
v.emplace_back(a);
推导为
v.emplace_back<const std::uint32_t &>(a);
其中函数参数应为std::uint32_t
.完美匹配,无需在系统标题之外进行转换。如果要在系统标头中启用警告,则最终可能会得到一堆虚假警告
要在代码中获得隐式转换,您需要强制emplace_back
期望std::uint16_t
,这可以通过
v.emplace_back<const std::uint16_t &>(a);
这将在调用emplace_back
之前隐式地将a
转换为std::uint16_t
,以与push_back
相同的方式触发编译器警告。
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何从字符串转换为双精度*
- C++如何将字符串逐行转换为双精度
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 如何检测 std::vector::emplace_back 上的隐式转换损失整数精度
- 如何防止双精度值到整数的隐式转换
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- int 到浮点转换的精度损失
- 在C++中将字符串转换为双精度,而无需科学记数法
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 如何在C++中将字符串转换为双精度?
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- JPEG:YCrCb <-> RGB 转换精度
- 双倍到科学记数法转换 - 精度误差
- 从Int到Float到Int的转换精度损失