Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用括号初始化时,没有关于变窄的警告_C++_Gcc_C++11_G++ - Fatal编程技术网

C++ 使用括号初始化时,没有关于变窄的警告

C++ 使用括号初始化时,没有关于变窄的警告,c++,gcc,c++11,g++,C++,Gcc,C++11,G++,我偶然发现了一个令人困惑的情况,我发现了一个明显的窄化转换,但令我失望的是,尽管有-Wall-Wnarrowing-pedantic标志,编译器(gcc-4.7.2)没有发出警告。请看以下节目: 结构A{ int m; A(int m):m(m){}; }; int main(){ 无符号长v=0; a1(v);//变窄,但没有警告(这是否会导致警告?) a2{v};//变窄,发出警告(预期) } a1的初始化似乎在没有编译器窥视的情况下进行。为了确保我没有发疯,我试着用同样的方式初始化a1,

我偶然发现了一个令人困惑的情况,我发现了一个明显的窄化转换,但令我失望的是,尽管有
-Wall-Wnarrowing-pedantic
标志,编译器(gcc-4.7.2)没有发出警告。请看以下节目:

结构A{ int m; A(int m):m(m){}; }; int main(){ 无符号长v=0; a1(v);//变窄,但没有警告(这是否会导致警告?) a2{v};//变窄,发出警告(预期) }
a1
的初始化似乎在没有编译器窥视的情况下进行。为了确保我没有发疯,我试着用同样的方式初始化
a1
,但是用大括号而不是括号。正如预期的那样,编译器警告第二种情况下的变窄

明确地说:我不是在问缩小初始化列表中转换的合法性。我知道这是不合法的,
a2
的花括号初始化仅仅是一种理智检查我的问题与初始化列表无关。这不是重复的问题。


如果编译器没有为
a1
的初始化警告我缩小范围?

Wsign conversion
将为该行代码生成警告-
-Wconversion
将不会在
无符号long
int
具有相同大小时(在许多平台上,甚至一些64位平台上都是如此)。对于C代码,> WSHIGT/Ung>会隐式地启用<代码> -WSCORE转换,但这不是因为C++原因而发生的。
如果将
v
的类型更改为
long
-Wconversion
本身将生成警告(假设
int
为32位)

a1
的构造函数可以进行一次隐式转换,而
a2
的构造函数不能。为什么您认为它们应该是相同的?如果添加
-Wconversion
标志会怎么样?这不是重复的。我已经知道在初始化列表中缩小转换范围是非法的。我问的是带括号的初始化。@gx\ucode>-Wconversion不会改变任何东西。我相信这是由
-Wall
@ironsavier暗示的:Wconversion不是由Wall暗示的。在GCC4.7和Clang3.3中,我在Wall(以及更多的Wconversion)中得到了警告;非常感谢您的见解。我很高兴初始值设定项列表语义对于转换非常具体——这可能是我开始使用
{}
的一个很好的理由,因为我需要代码最具可移植性,这样编译器就可以在我真正针对新平台之前捕捉转换陷阱。