考虑这段代码:
#include <iostream>
#include <vector>
#include <cstdint>
int main() {
std::vector<int> a{ 10, 11, 12, 13, 14, 15 };
for (int32_t i = 0; i < a.size(); i++)
std::cout << i << " ";
}
i < a.size()
应该触发“有符号/无符号不匹配”警告,至少如果设置了适当的警告开关。
gcc(带有 -Wall
)和 clang(带有 -Wall -Wextra
)都会在有或没有 -m32
的情况下触发警告。开关。
Microsoft x32 编译器也会触发警告,但 Microsoft x64 编译器不会触发警告。
您可以在这里尝试:https://www.godbolt.org/z/x74Mzdh4Y
这是 Microsoft x64 编译器中的错误吗?
最佳答案
不,这不是错误。 C++ 编译器不需要对每个潜在未定义、未指定的行为或意外结果发出诊断。任何此类诊断消息都被视为额外奖励。
即使正式指定编译器应该在有符号与无符号比较行为可能产生意外结果的情况下发出诊断:
在这种情况下,编译器可以证明 i
永远不会变为负数,并且由于整数提升规则而导致意外结果,因此没有问题。 x32 和 x64 有很大不同,编译器可能采用不同的优化和代码分析技术,因此 x32 编译器(而不是 x64 编译器)可以证明这一点,从而无需进行诊断。
关于c++ - Microsoft x64 编译器中存在签名/未签名不匹配警告的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72042059/