son*_*yao 25 c++ iso type-conversion language-lawyer
我正在检查缩小转换的标准,我认为对于缩小转换,应该触发错误.因为标准说:
[注意:如上所述,列表初始化中的顶层不允许进行此类转换. - 结束说明]
我认为"不允许"的描述意味着编译应该失败.
但有人告诉我,这里只是说"程序格式不正确",标准不要求编译必须失败.
如果需要缩小转换(见下文)将元素转换为T,则程序格式不正确.
所以我的问题是:标准是否指定是否应该生成错误或警告?或者在某些情况下编译应该失败?从编译器的角度来看,编译程序是否可以,只是给出一些警告?
BTW:Clang 4.0.0和Gcc 7.0.0表现不同.
float a {1.e39}; // Error for both Clang and GCC
double d;
float a3{d}; // Error for Clang, warning for GCC
Run Code Online (Sandbox Code Playgroud)
Bo *_*son 31
该标准不使用术语"错误"和"警告",它只讨论编译器必须"发出诊断"的情况.
在您的示例中,如果程序"格式错误",编译器必须以某种方式告诉您 - 发出诊断.
之后,它可以做任何喜欢的事情 - 包括编译和运行程序.该标准仅指定符合代码的情况,其他所有内容都未定义.然后,正如我们所知,任何事情都可能发生.
如果程序不是格式错误,则编译器必须生成可执行输出.如果程序不包含UB,则可执行文件必须表现为标准描述其将表现状态的抽象机器.如果它确实包含UB,则可执行文件可以执行任何操作.
如果程序格式错误且无需诊断,则编译器可以执行任何操作.它可以生成可执行输出.该可执行输出可以做任何事情.例如,它可以设计一个似乎与代码意图相匹配的程序.
编译器可以随时打印诊断程序.
编译器被要求在某些情况下打印诊断程序."大多数"形成不良的程序需要诊断.诊断的确切含义是实现定义.已经注意到,打印单个空白换行符或空格是该标准下的有效诊断.
这将被视为执行质量差.
当存在需要诊断的格式错误的程序时打印诊断,编译器可以自由地执行任何操作.它可以生成一个可执行文件,它可以满足您的要求,生成可执行任何操作的可执行文件,或者不生成任何可执行文件.
该标准不区分警告和错误.
一个不正确的程序需要诊断程序打印警告,然后继续编译,不违反标准.
一个不正确的程序,需要一个打印错误的诊断程序,然后不继续编译,不违反标准.
不需要诊断的不良程序可以打印诊断.它可以选择生成可执行文件.可执行文件可以做一些合理的事情.
格式良好的程序可以让编译器发出诊断信息.此诊断可以描述为警告.它也可以被描述为错误,但编译器必须生成可执行文件,并且可执行文件必须执行标准强制要求.