MSVC 大括号初始化与双打似乎违反了标准?

2023-11-28

看看这个简单的程序:

int main() {
    float f2 = 7.2; // OK, with warning
    float f3 = 7.199999809265137; // OK, no warning
    float f4{ 7.2 }; // Fails
    float f5{ 7.199999809265137 }; // OK, no warning
    float f6 = { 7.2 }; // Fails
    float f7 = { 7.199999809265137 }; // OK, no warning
}

当使用默认选项(cl /W4,版本 19.00.23918),我收到以下消息:

FloatTest.cpp(2): warning C4305: 'initializing': truncation from 'double' to 'float'
FloatTest.cpp(4): error C2397: conversion from 'double' to 'float' requires a narrowing conversion
FloatTest.cpp(4): warning C4305: 'initializing': truncation from 'double' to 'float'
FloatTest.cpp(6): error C2397: conversion from 'double' to 'float' requires a narrowing conversion
FloatTest.cpp(6): warning C4305: 'initializing': truncation from 'double' to 'float'

该程序可以在 Clang 3.0-3.8 和 GCC 4.5.4-6.1.0 上正常编译(经过测试)http://melpon.org/wandbox),仅对未使用的变量发出警告。此外,删除/注释掉行f4 and f6导致编译成功(只有一行警告f2).

最初看起来 MSVC 只是告诉我 7.2 不能精确地表示为float,所以这是一个缩小转换(这在大括号初始化中是非法的)。然而,标准(草案 N3337),第 8.5.4 节,注释 7,这样说:

A 缩小转换范围是隐式转换...

  • from long double to double or float,或从double to float,除非源是常量表达式并且转换后的实际值在可以表示的值范围内(即使它不能被准确地表示)

强调我的。由于 7.2 在由 表示的值范围内float,其转换为float根据标准不应是缩小转换。 MSVC 这里有错吗?我应该提交一个错误吗?


确实,它看起来像一个错误。对于解决方法,以下方法似乎可以消除 MSVC 2015 中的错误和警告。

#pragma float_control(precise, off, push)

float f2 = 7.2; // OK, with warning
//...

#pragma float_control(precise, pop)

如果使用以下命令,则在全球范围内同样有效/fp:fast编译器开关,尽管该开关与/Za这会禁用 MS 语言扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MSVC 大括号初始化与双打似乎违反了标准? 的相关文章

随机推荐