Могу ли я использовать объект в одном и том же выражении более одного раза, не меняя его безопасно? - PullRequest
4 голосов
/ 02 ноября 2019

Я видел этот пример в выпуске C ++ primer 5, в котором говорится об умных указателях;У меня есть класс StrBlobPtr, который работает как компаньон для StrBlob.

Один из членов StrBlobPtr - deref:

std::string& StrBlobPtr::deref() const
{
    auto p = check(curr, "dereference past end");
    return (*p)[curr]; // (*p) is the vector to which this object points
}

check возвращает std::shared_ptr либо ноль, либо указание на объект.

  • Я хочу знать только то, могу ли я сделать оператор return непосредственно из вызова check или нет:

    std::string& StrblobPtr::deref() {
        return (*check(index_, "dereferencing unbound StrblobPtr!"))[index_];
    }
    
  • Так хорошо ли здесь определено использование index_ в одном и том же выражении дважды без его изменения? Спасибо!

1 Ответ

5 голосов
/ 02 ноября 2019

Использование index дважды в

return (*check(index_, "dereferencing unbound StrblobPtr!"))[index_];

в порядке, если вы не изменяете его.

Что не хорошо, хотя вы безоговорочно указываете указатель. Вы говорите, check может вернуть нулевой указатель. Обращение через нулевой указатель является неопределенным поведением. Вы должны убедиться, что вы защититесь от этого, проверив возвращаемое значение в первую очередь. Если значение равно нулю, вам нужно либо вернуть часового, либо выдать исключение.

...