Каков «правильный» способ избежать сглаживания (например, при добавлении элемента контейнера к самому себе) в C ++?

std::vector a;
a.push_back(1);
a.push_back(a[0]);

Я только что узнал , что приведенный выше код может быть очень опасным.

(Если не очевидно, почему, вы не одиноки ... для меня это тоже не было очевидно.)

Мои вопросы:

  1. Каков «стандартный» способ справиться с этим? Мне кажется немного странным создание новой переменной и последующее присвоение ее чему-либо. Есть ли лучший способ справиться с этим?

  2. Как вы обучаете себя остерегаться подобных проблем с псевдонимом? Какой узор (ы) вы ищете? Я понятия не имею, как распознать эту ситуацию; Я узнал об алиасинге только тогда, когда узнал о ключевом слове restrict в C, и только теперь я понимаю, в чем проблема на самом деле.


Изменить:

Я бы хотел принять ответ, но похоже, что на часть (2) вопроса нет ответа. Мне интересно, какие стратегии люди используют для обнаружения ошибок псевдонима в написанном ими коде.

Одна стратегия, которую я придумал до сих пор, - избегать передачи одного и того же значения для двух параметров. (В данном случае один параметр является неявным, а один - явным.)

Есть ли другие простые вещи, на которые следует обратить внимание?

11
задан Community 23 May 2017 в 12:09
поделиться