C++ - 无符号长长到有符号长长的隐式转换?

Mar*_*tin 3 c++

我收到 clang-tidy 12.0.1 报告的相当奇怪的警告。在下面的代码中:

#include <vector>

int main()
{
    std::vector<int> v1;

    const auto a = v1.begin() + v1.size();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我看到这个警告被触发:

error: narrowing conversion from 'std::vector<int>::size_type' (aka 'unsigned long long') to signed type 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>::difference_type' (aka 'long long') is implementation-defined [bugprone-narrowing-conversions,cppcoreguidelines-narrowing-conversions,-warnings-as-errors]
    const auto a = v1.begin() + v1.size();
                                ^
Run Code Online (Sandbox Code Playgroud)

据我了解,当操作两个大小相同但符号不同的整数时,有符号整数将转换为无符号整数,而不是相反。我在这里错过了什么吗?

bol*_*lov 5

从 C++20 开始,一个简单的修复方法是使用std::sszie

const auto a = v1.begin() + std::ssize(v1);
Run Code Online (Sandbox Code Playgroud)