Я только что получил ошибку компилятора для следующей конструкции:
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);
Поскольку он принимает ссылки lvalue одного и того же типа, я был удивлен, что смог исправить это с помощью встроенного преобразования типов:
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;
2 ответа
Подпись std::min
заставляет аргументы одного и того же типа:
template <class T> const T& min (const T& a, const T& b);
Вызов неоднозначен, если типы аргументов различаются.
Однако можно использовать временные значения (полученные, например, в результате выражения приведения) вместо аргументов, потому что std::min
принимает const
lvalue-ссылки.
В качестве альтернативы вы можете принудительно использовать тип, используемый для создания экземпляра std::min
:
std::min<std::size_t>(PySequence_Fast_GET_SIZE(__transforms), N);
Да, ты можешь. Тем не менее, он эквивалентен указанному вами варианту. Вы можете использовать форму:
size_t Ntransforms = std::min(static_cast<size_t>(PySequence_Fast_GET_SIZE(__transforms)), N);
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
PySequence_Fast_GET_SIZE
никогда не возвращает отрицательное значение, вы также можете вместо этого указать явный тип шаблона, напримерstd::min<size_t>
, и полагаться на неявное преобразование. Хотя здесь это не имеет никакого значения, возможно, вы захотите избежать использования приведений в стиле c, но лучше привыкнуть вместо этого использоватьstatic_cast
.min
принимаетconst lvalue references
, поэтому они привязываются к временнымPySequence_Fast_GET_SIZE
.