Как обойтись с помощью reverse_iterator в функции constexpr - PullRequest
0 голосов
/ 27 мая 2020

У меня есть предварительно заполненный std::vector<uint64_t>, который я передаю своей функции constexpr по постоянной ссылке и другой std::vector<uint64_t>, который я передаю по ссылке, чтобы заполнить значениями.

Я хочу вычислить расстояние между каждым элементом в векторе collection ниже и сохранить результаты в векторе distances. Другими словами, я хочу взять значение с индексом 1 и вычесть его из значения с индексом 0, затем сохранить его в другом векторе и так далее.

Я думал об использовании reverse_iterator или const_reverse_iterator, чтобы помочь с этим процессом ...

constexpr void euclidean_distance(const std::vector<uint64_t>& collection, std::vector<uint64_t> distances ) {
    auto It1 = collection.rbegin();   // fails to compile
    auto It2 = collection.crbegin();  // fails to compile

    // ... code to do the calculation...
}

Однако в Visual Studio 2017 оба из них не компилируются, поскольку они не являются буквальным типом ...

Какие параметры у меня есть для достижения аналогичной функциональности?

1 Ответ

1 голос
/ 27 мая 2020

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

В C ++ constexpr означает, что значение должно быть доступно во время компиляции. const, с другой стороны, просто означает, что данные неизменяемы.

Не используйте здесь constexpr. Это не имеет никакого смысла. Фактически, даже если ваша функция возвращает const, не имеет смысла! Функции void ничего не возвращают и ни при каких обстоятельствах не должны уточняться с помощью const или constexpr. Функции constexpr предназначены для случаев, когда вы хотите оценить вычисления между примитивными типами данных (например, int, float, char) во время компиляции, а входные данные также должны быть constexpr.

primes здесь не указано, кстати ... это опечатка?

Кстати, вы не должны инициализировать .crend ​​() ни для чего. Вместо этого вы должны использовать .crbegin ().

const std::vector<uint64_t>& не является константной ссылкой, это ссылка на константный вектор. И технически все ссылки являются константными ...

...