我不明白为什么我会收到有关有符号和无符号之间转换的警告,是我的编译器错误吗?

Ete*_*nal 5 c++ embedded-linux

我有这个代码:

#include <cstdint>
#include <deque>
#include <iostream>

int main()
{
    std::deque<uint8_t> receivedBytes;
    int nbExpectedBytes = 1;

    if (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes))
    {
        std::cout << "here" << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用 -Wsign-conversion,这在我的 linux 笔记本电脑上编译时不会发出警告,但在要运行的嵌入式 linux 上,我收到以下警告:

temp.cpp:在函数“int main()”中:temp.cpp:10:33: 警告:从“int”转换为“std::deque::size_type {aka long unsigned int}”可能会改变结果 [-Wsign-conversion]

 if (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes))
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我就是不明白:

  • 我在我的 linux 笔记本电脑和嵌入式 linux 上都启用了 -Wsign-conversion,那么为什么我只在嵌入式 linux 上收到警告?
  • 我明确地从intto 转换size_t(它不应该产生警告,因为转换是显式的),然后将 asize_t与 a进行比较std::deque<unsigned char>::size_type,那么从有符号到无符号的隐式转换在哪里触发警告??!

我不禁认为嵌入式linux上的编译器在这里是错误的。我错过了什么吗?

编辑:在我的 linux 笔记本电脑上,我使用的是 g++ 9.3.0 版,而在嵌入式 linux 上,我使用的是 g++ 6.3.0 版(可能不是通常的二进制文件,因为它是 ARM64 架构)

Adr*_*ica 4

无疑是嵌入式编译器中的一个错误/错误。static_cast从比较中分离可以消除警告,从在Compiler Explorer>=上测试以下代码可以看出,选择了 ARM64 gcc 6.3.0 (linux):

#include <deque>
#include <cstddef>
#include <cstdint>

int main()
{
    std::deque<uint8_t> receivedBytes;
    int nbExpectedBytes = 1;

    // Warning generated ...
    while (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes))
    {
        break;
    }

    // Warning NOT generated ...
    size_t blob = static_cast<size_t>(nbExpectedBytes);
    while (receivedBytes.size() >= blob)
    {
        break;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此外,当更改为(32位)ARM gcc 6.3.0(linux)编译器时,警告也会消失。