Приведение указателя в C++ при передаче указателя в качестве параметра для ссылки

Мне любопытно, это:

bool State::operator<(const State* S)
{
  return this->operator<(*dynamic_cast<const State *>(S));
}

точно так же как:

bool State::operator<(const State* S)
{
  return this->operator<(*(S));
}

Для справки this->operator< Быть призванным

bool State::operator<(const State& S)
{
  return this->reward < S.reward ? true : false;
}

Какой из них более "правильный" и типа безопасный / безопасный для использования, или есть какая-то реальная разница?

2 ответа

Решение

Нет, первый бросает указатель на себя, который ничего не делает, а затем вызывает const State* перегрузка, что приводит к бесконечному циклу. Вам не нужно dynamic_cast до тех пор, пока вам не нужно выполнить downcast во время выполнения - здесь нет downcasting, так что

return this->operator<(*S);

это единственное, что нужно сделать.

Предполагая, что у вас есть опечатка, и вы хотите сравнить это:

*dynamic_cast<const State *>(s)

...к этому:

*s

... где s имеет тип времени компиляции const State *Нет никакой разницы.

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

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

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