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