c++ - Microsoft x64 编译器中存在签名/未签名不匹配警告的错误?

标签 c++ visual-studio

考虑这段代码:

#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/

相关文章:

visual-studio - Visual Studio : missing Shortcut: "Visual Studio Command Prompt"

C++ 派生类型必须定义静态 constexpr

c++ - 存储不同类型的数据c++

c++ - 基类方法别名

visual-studio - 如何使用 docker-compose 启动 CosmosDB 模拟器?

angular - Visual Studio 2015 Typescript 无法识别导入的成员和模块

c++ - C++ 中线程所做的更改

c++ - 按偶数和奇数索引对 vector 进行排序。 C++

visual-studio - 如何停止 Visual Studio 自动升级项目?

c++ - 在 Visual Studio 中创建第一个 C++ 项目