Приведение Const Pointer для работы с устаревшим кодом C

В продолжение моего предыдущего вопроса ( влияние на производительность массива переменной длины (C / C++)) у меня возникли некоторые проблемы с поддержанием правильности констант с помощью системного вызова C writev(). А именно, похоже, что я столкнулся с той же проблемой, что и этот пользователь в C, хотя я использую C++:

https://codereview.stackexchange.com/questions/9547/casting-const-pointer-to-non-const-pointer-when-using-struct-iovec

Вот фрагмент моего кода:

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, я немного подозрительна.

Заранее спасибо за помощь.

2 ответа

Решение

Да, ваше использование 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 выглядит нормально.

Другие вопросы по тегам