Какой векторный адрес безопаснее? - PullRequest
0 голосов
/ 24 сентября 2018

Предполагая, что функции нужен указатель на вектор типа T, но когда у меня есть только вектор вектора типа T (тип не обязательно является POD), это безопаснее

std::vector<std::vector<T>> input;
auto selectedVectorPtr=&input[j];

чем это

std::vector<std::vector<T>> input;
auto selectedVectorPtr=&(input[j]);

, также предполагая, что область ввода не заканчивается, пока эта функция, которая принимает selectedVectorPtr в качестве параметра.

Мои опасения (/ заблуждения):

  • создает () какой-либо временный объект?Значит, взятие адреса - это плохо?
  • Влияет ли перегрузка оператора & или [] на тип T на изменение приоритета приоритета оператора?
  • что если вектор (или оба) равенизменил размер после получения адреса?

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Приоритет оператора диктует, что [] оценивается перед ведущим &.Следовательно, между этими двумя выражениями нет никакой разницы.

Поскольку вы задались вопросом о последствиях для фрагментов кода для безопасности, для &input[j] необходимо рассмотреть две проблемы (независимо от внешних скобок):

  • Индекс может выходить за пределы, что ведет к неопределенному поведению.Возможно, вы захотите использовать (возможно, бросающий, но более безопасный) std::vector::at вместо std::vector::operator[] и заключить его в блок try - catch.
  • Если вы хотите взять адрес T, который априори неизвестен, operator & может быть перегружен на T.Хотя это в первую очередь зло, вы можете использовать std::addressof, чтобы уменьшить вероятность.Обратите внимание, что в вашем случае это не нужно, поскольку вы берете адрес экземпляра std::vector.
0 голосов
/ 24 сентября 2018

&input[j] и &(input[j]) не будут иметь никакой разницы.Это связано с тем, что operator[] имеет более высокий приоритет, чем operator&.

Так что в обоих случаях он оценивается как &(input[j])

0 голосов
/ 24 сентября 2018

operator[] имеет более высокий приоритет, чем operator& (постфиксные операторы имеют наивысший приоритет), поэтому здесь он оценивается первым, скобки не нужны.Здесь нет никакой разницы между &input[j] и &(input[j]).


Альтернативный более простой синтаксис:

auto selectedVectorPtr = input.data() + j;

Здесь также не требуется std::addressof.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...