给出变量size_t idx
,当在64位以下编译时,类似double value = idx;
的赋值产生以下警告:
'initializing': conversion from 'size_t' to 'double', possible loss of data
似乎与size_t
值在64位以下编译时占用8个字节这一事实有关。但是,分配double value = static_cast<double>(idx)
不会产生任何警告。有人可以向我解释为什么前一个作业不起作用而后者却起作用吗?
提前感谢!
static_cast<double>
是告诉编译器您有意识地转换为static_cast<double>
并了解所有含义的方式。这意味着编译器不应警告您风险,因为您已经明确告知风险,您已经意识到这些风险。
在第一种情况下,如果您不使用double
,则转换是合法的,但存在失去精度的风险。由于您可能没有注意到此转换正在进行中,因此有必要警告您。
这两个作业都将“起作用”,并且实际上会做完全相同的事情!唯一的不同是,在第二种情况下,static_cast
,您的explicit强制类型转换使编译器清楚地知道您“知道自己在做什么”,并且转换中可能会损失很多数字。
在第一种情况下,编译器只是警告您转换可能(无意中)导致数据丢失(在这种情况下为精度)。
当你做的时候
double value = static_cast<double>(idx)
编译器看了看然后说:“嘿,double value = idx;
可能不适合idx
,让我们告诉程序员万一这是一个错误。”这就是为什么您收到警告。
当你做的时候
value
编译器看了看然后说:“哦,程序员在这里明确地强制转换,这一定是他们想要的。”这意味着它不会发出警告。
这是一个警告,因为程序员可能没有意识到他们在分配过程中正在丢失位。
但是如果您在那里有显式转换,则编译器会假定程序员知道他们在做什么,因为该转换就在您的面前,就在您的面前。