有符号和无符号之间的比较。 static_cast 是唯一的解决方案吗?
Comparison between signed and unsigned. Is static_cast the only solution?
我使用使用 int
存储尺寸的第三方容器。我还使用使用 size_t
存储大小的 stl 容器。
我经常在我的代码中必须在同一个循环中使用两者,例如:
// vec is std::vector
// list is the third party container
assert(vec.size() == list.size()); // warning
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[i]; // warning
}
因此,要解决这个问题,我必须执行函数样式转换,有人告诉我这是变相的 C 样式转换。
// vec is std::vector
// list is the third party container
assert(int(vec.size()) == list.size());
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[int(i)];
}
或者我可以做每个人都推荐的更丑陋的解决方案。静态铸造。
// vec is std::vector
// list is the third party container
assert(static_cast<int>(vec.size()) == list.size());
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[static_cast<int>(i)];
}
我真的不想static_cast
。
- 这种特定情况下的隐式转换会很危险吗?
- 在我的情况下函数样式可以吗?
- 如果static_cast确实是唯一安全的解决方案。我应该将
int
转换为 size_t
还是将 size_t
转换为 int
?
谢谢。
二元运算符(此处为operator==
)如果其中一个参数是无符号的,则将有符号整数转换为无符号整数。一个带符号的负整数变成一个大的正整数。
容器元素数不能为负数,以免违反最小意外原则。因此,隐式转换必须是安全的。但是一定要勾选int size() const
.
的implementation/documentation
您可能希望保留隐式转换的语义并使用 as_unsigned
函数来避免转换并更好地传达意图:
#include <type_traits>
template<class T>
inline typename std::make_unsigned<T>::type as_unsigned(T a) {
return static_cast<typename std::make_unsigned<T>::type>(a);
}
然后:
assert(vec.size() == as_unsigned(list.size()));
我使用使用 int
存储尺寸的第三方容器。我还使用使用 size_t
存储大小的 stl 容器。
我经常在我的代码中必须在同一个循环中使用两者,例如:
// vec is std::vector
// list is the third party container
assert(vec.size() == list.size()); // warning
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[i]; // warning
}
因此,要解决这个问题,我必须执行函数样式转换,有人告诉我这是变相的 C 样式转换。
// vec is std::vector
// list is the third party container
assert(int(vec.size()) == list.size());
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[int(i)];
}
或者我可以做每个人都推荐的更丑陋的解决方案。静态铸造。
// vec is std::vector
// list is the third party container
assert(static_cast<int>(vec.size()) == list.size());
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[static_cast<int>(i)];
}
我真的不想static_cast
。
- 这种特定情况下的隐式转换会很危险吗?
- 在我的情况下函数样式可以吗?
- 如果static_cast确实是唯一安全的解决方案。我应该将
int
转换为size_t
还是将size_t
转换为int
?
谢谢。
二元运算符(此处为operator==
)如果其中一个参数是无符号的,则将有符号整数转换为无符号整数。一个带符号的负整数变成一个大的正整数。
容器元素数不能为负数,以免违反最小意外原则。因此,隐式转换必须是安全的。但是一定要勾选int size() const
.
您可能希望保留隐式转换的语义并使用 as_unsigned
函数来避免转换并更好地传达意图:
#include <type_traits>
template<class T>
inline typename std::make_unsigned<T>::type as_unsigned(T a) {
return static_cast<typename std::make_unsigned<T>::type>(a);
}
然后:
assert(vec.size() == as_unsigned(list.size()));