Как продолжение моего предыдущего вопроса (Значения производительности массива переменной длины (C / C ++)), У меня возникли проблемы с сохранением правильности констант с помощью системного вызова C writev (). А именно, похоже, что я столкнулся с той же проблемой, что и этот пользователь в C, хотя я использую C ++:
Вот фрагмент моего кода:
int my_awesome_transmit_function(const uint8_t* const buffer, const size_t length) {
// ... some stuff happens...
struct iovec iov[2];
iov[1].iov_base = buffer; // compiler yells about this
iov[1].iov_len = length;
// ... some more code you don't care about
writev(my_fd, iov, 2);
}
Учитывая решение, представленное в посте CodeReview, я внес следующее изменение в строку, которая вызывает у меня проблемы, поскольку я хотел бы избежать приведения в стиле C:
iov[1].iov_base = const_cast<uint8_t*>(buffer);
Это правильный способ использования константного приведения? Насколько я могу сказать, writev гарантирует, что структура iov не будет изменена (http://linux.die.net/man/2/writev). Это сообщение в блоге (http://blog.aaronballman.com/2011/06/when-should-you-use-const_cast/) заставляет меня поверить, что это допустимое использование (поскольку я никогда не изменяю буфер), но я бы хотел быть уверенным, поскольку, как правило, везде, где я вижу const_cast или reinterpret_cast, я получаю немного подозрительно.
Заранее спасибо за помощь.
Да, ваше использование const_cast
Это хорошо.
Если один из элементов массива не будет изменен (когда-либо), вы можете объявить его как const.
const struct iovec iov_c(buffer, length); // create a constructor for your struct! always neater than
// assigning their members directly in code.
Это предполагает, что у вас есть контроль над сигнатурой writev (..) и вы можете передать два указателя iovec.
Если нет, то использование const_cast там выглядит нормально.