【发布时间】:2026-01-05 11:35:01
【问题描述】:
我偶然发现了一个令人困惑的情况,我发现了一个明显的缩小转换,但我很失望编译器 (gcc-4.7.2) 尽管有-Wall -Wnarrowing -pedantic 标志但没有发出警告。请看以下程序:
struct A {
int m;
A( int m ) : m(m) {};
};
int main() {
unsigned long v = 0;
A a1(v); // narrowing, but no warning (should this not cause a warning?)
A a2{v}; // narrowing, warning raised (expected)
}
a1 的初始化似乎在没有编译器窥视的情况下运行。为了确保我不会发疯,我尝试以相同的方式初始化a1,但使用大括号而不是括号。正如预期的那样,编译器会在第二种情况下警告缩小。
要明确:我不是在询问缩小初始化列表中的转换的合法性。我知道这是不合法的——a2 的花括号初始化只是一个健全的检查。 我的问题与初始化列表无关。这不是重复的问题。
对于a1 的初始化,编译器不应该警告我缩小范围吗?
【问题讨论】:
-
a1的构造函数可以进行一次隐式转换,而a2则不能。为什么你认为它们应该是一样的? -
如果添加
-Wconversion标志会怎样? -
这不是重复的。我已经知道在初始化列表中缩小转换是非法的。我问的是带括号的初始化。
-
@gx_
-Wconversion没有任何改变。我相信-Wall暗示了这一点 -
@IronSavior:Wall 没有暗示 Wconversion。我在 GCC 4.7 和 clang 3.3 的 Wall(以及更多的 Wconversion)中收到了警告;