добавьте функцию constexpr: нам нужно условие обтекания? - PullRequest
2 голосов
/ 25 апреля 2020

Basi c Идея заключается в следующем: у меня есть некоторая функция constexpr, и я хочу использовать throw для сигнализации об ошибке и отложенной компиляции, чтобы избежать этой ошибки в нормальном потоке:

template <size_t N>
auto constexpr find_elt(const std::array<int, N>& a, int k) {
  for (size_t i = 0; i < N; ++i)
    if (k == a[i])
      return i;
  throw "not found";
}

И затем:

constexpr int result = find_elt(arr, 4);

Обычно, если в массиве существует 4, я получу его индекс во время компиляции.

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

Но я заметил странное поведение:

Под последним лязгом все работает

При последней версии g cc все терпит неудачу

Законна ли эта идея? Является ли этот код правильным для того, чего я хочу достичь? Какой компилятор говорит мне правду здесь?

Если нет, как правильно это сделать?

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

...