Создание экземпляра шаблонной функции в false, если constexpr выдает ошибку - PullRequest
0 голосов
/ 07 ноября 2018

Рассмотрим следующую программу:

#include <iostream>

template<typename... Params_t>
constexpr int constexprValue(Params_t...) { return 5; }

int main()
{
    const bool flag = true;

    if constexpr(flag)
    {
        constexpr int value = constexprValue(1, 2, 3);
        std::cout << value << "\n";
    }
}

Это компилируется и работает нормально. Однако, если flag изменяется на false, то clang (Apple LLVM версия 10.0.0 (clang-1000.10.44.4)) выдает ошибку компилятора:

error: constexpr variable 'value' must be initialized by a constant expression
undefined function 'constexprValue<int, int, int>' cannot be used in a constant expression

Это ошибка в Clang?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Да, это ошибка, которая была исправлена ​​этим коммитом к лягушке: [Sema] Отброшенный статус должен быть оцениваемым контекстом. , который имеет следующее описание:

Произошла ошибка constexpr, потому что эти шаблоны не были определены. Несмотря на то, что используется в отброшенном утверждении, нам все еще нужно оцените их, а это значит, что нам нужно их создать. Исправления PR37585.

Редакция дифференциала: https://reviews.llvm.org/D48322

и включает следующий тест:

namespace PR37585 {
template <class T> struct S { static constexpr bool value = true; };
template <class T> constexpr bool f() { return true; }
template <class T> constexpr bool v = true;

void test() {
  if constexpr (true) {}
  else if constexpr (f<int>()) {}
  else if constexpr (S<int>::value) {}
  else if constexpr (v<int>) {}
}
}

Если мы попробуем выполнить тест вживую с помощью Godbolt с более старой версией Clang , мы получим очень похожую ошибочную диагностику, которую видит ваш пример:

error: constexpr if condition is not a constant expression
else if constexpr (f<int>()) {}
                   ^~~~~~~~

note: undefined function 'f<int>' cannot be used in a constant expression

исправление возникло из сообщения об ошибке: constexpr, если условие не является константным выражением, и std :: is_same .

0 голосов
/ 07 ноября 2018

Да, похоже, это ошибка в версии Apple Clang, я могу скомпилировать код с версией 5 Clang и выше, а также с версией GCC 7.1 и выше.

У Matt Godbold есть отличный сайт для компиляции фрагментов кода с множеством различных компиляторов.

Здесь - ссылка на ваш пример в Godbolt.

...