【发布时间】:2018-12-31 23:40:03
【问题描述】:
我正在尝试将 long 类型变量转换为 int 类型变量,使用 uniform initialization 而没有它。但是我只有在统一初始化时才会收到编译器警告。这是为什么?为什么gcc 在这两种情况下都没有警告?我也试过clang,得到了类似的结果。
这是代码
#include <iostream>
int main() {
long l = 1;
int i1 = l;
int i2 = { l };
std::cout << i1 << std::endl;
std::cout << i2 << std::endl;
return 0;
}
我得到的唯一一个警告
$ g++ -Wall -Wextra 1.cpp
1.cpp: In function ‘int main()’:
1.cpp:6:16: warning: narrowing conversion of ‘l’ from ‘long int’ to ‘int’ inside { } [-Wnarrowing]
int i2 = { l };
【问题讨论】:
-
因为这是指定语言的工作方式?
-
这只是为了向后兼容而保留的语言缺陷之一。
-
编译器(几乎)没有义务发出警告。将警告视为帮手,但不要依赖编译器总是警告有问题的构造或错误代码。最后,您有责任了解语言规则并编写正确的代码。编译器只是在可能的时候(通常)尝试提供帮助。至于缩小转换;只有在使用“{}”语法时才允许这些。
-
使用
-Wconversion获得更多转化警告。 -
@JesperJuhl 更准确地说:当程序格式错误时(例如在示例的第三次初始化的情况下),编译器(几乎)总是有义务发出诊断消息。但是,如果编译器选择拒绝编译格式错误的程序(这是允许的,但不是强制的),则诊断消息通俗地归类为错误,而不是警告。编译器没有义务警告格式正确的代码,例如前两个初始化。
标签: c++ c++11 language-lawyer compiler-warnings uniform-initialization