我刚刚遇到以下构造的编译器错误:
size_t N = 10;
size_t Ntransforms = std::min(PySequence_Fast_GET_SIZE(__transforms), N);
因为PySequence_Fast_GET_SIZE()
实际返回Py_ssize_t
而std::min()
被定义为
template <class T> const T& min (const T& a, const T& b);
由于它采用相同类型的左值引用,我很惊讶我可以使用内联类型转换来修复它:
size_t Ntransforms = std::min((size_t)PySequence_Fast_GET_SIZE(__transforms), N);
这样好吗?如果是,它是否等同于显式代码:
size_t Ntransforms = PySequence_Fast_GET_SIZE(__transforms);
if (Ntransforms > N) Ntransforms = N;
答案 0 :(得分:6)
std::min
签名会强制使用相同类型的参数:
template <class T> const T& min (const T& a, const T& b);
如果参数类型不同,则调用不明确。
但是,可以使用临时(例如由演员表达式代替)来代替参数,因为std::min
需要const
左值引用。
或者,您可以强制用于实例化std::min
的类型:
std::min<std::size_t>(PySequence_Fast_GET_SIZE(__transforms), N);
答案 1 :(得分:0)
是的,你可以。但它等同于您指定的变体。您可以自由使用表格:
size_t Ntransforms = std::min(static_cast<size_t>(PySequence_Fast_GET_SIZE(__transforms)), N);