如何处理 std::vector<...>::size_type 为 int

Bur*_*dui 3 c++ types

我有两个向量:

std::vector<const A> v_a;
std::vector<B> v_b;    
Run Code Online (Sandbox Code Playgroud)

在程序v_a中充满了价值。现在我想将 type 的值转换AB和 fill v_b

我首先调整大小v_b,请注意 std::transform 对我不起作用:

v_b.resize(v_a.size());        // Auto-construct new elements using default c-tor
Run Code Online (Sandbox Code Playgroud)

这会导致以下警告:

Value Conversion Issue
-Wsign-conversion
202:55: warning: implicit conversion changes signedness: 'std::vector<const A, std::allocator<const A> >::size_type' (aka 'int') to 'std::vector<B, std::allocator<B> >::size_type' (aka 'unsigned long long')
Run Code Online (Sandbox Code Playgroud)

向量 size_type 怎么可能是 int,它至少应该是一个无符号的?

两个向量怎么可能有不同的 size_types?即使它们在不同的源文件中定义,编译器也应该使用相同的类型。是否可以修改 size_type?

我如何(安全地)检查是否v_a.size() < v_b.max_size()不产生新警告?


QT-Creator 声明我使用“Microsof Visual C++ Compiler 15.0 (amd64)”作为编译器。

L. *_* F. 5

avectorsize_typeis怎么可能int,它至少应该是一个未签名的?

这是实现上的问题。Per [container.requirements.general]/4X::size_type是一个无符号整数类型,其中X是一个容器。Avector是一个容器。

两个vectors怎么可能有不同的size_types?即使它们在不同的源文件中定义,编译器也应该使用相同的类型。

不完全是。两个vectors(具有不同的元素类型或分配器类型)可以自由拥有不同的size_types,只要它们是无符号整数类型并且可以表示相应difference_type.

可以修改size_type吗?

不可以。您不能直接更改库。

我如何(安全地)检查是否v_a.size() < v_b.max_size()不产生新警告?

对于您当前的情况,您可以使用强制转换作为解决方法。

v_b.resize(static_cast<std::vector<B>::size_type>(v_a.size()));
Run Code Online (Sandbox Code Playgroud)

同样,无论如何,这都是实现的错误,这不是您的错。

  • 相同类型的向量也应该具有相同的 `size_type`,不是吗? (3认同)

Bur*_*dui 5

感谢LF回答问题。

const正如 AMA 所指出的,真正的问题是在 的类型参数中使用v_a。这会导致编译器错误并最终导致我的问题中所述的警告。

解决方案是删除 const 限定符并修复依赖类型。