Специализация шаблона c ++ 14 "используется, но никогда не определяется" - PullRequest
0 голосов
/ 18 февраля 2019

Чтобы определить шаблон для рекурсии во время компиляции, я должен определить 2 шаблона, один нормальный шаблон и другой шаблон для «начального» случая, например:

template<int i>
struct Int {};

constexpr auto iter(Int<0>) -> Int<0>;

template<int i>
constexpr auto iter(Int<i>) -> decltype(auto) {
    return iter(Int<i-1>{});
}

int main() {
    decltype(iter(Int<10>{})) a;
    return 0;
}

Но gcc даетпредупреждение:

warning: inline function 'constexpr Int<0> iter(Int<0>)' used but never defined
constexpr auto iter(Int<0>) -> Int<0>;

Почему такое предупреждение?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы объявили функцию

constexpr auto iter(Int<0>) -> Int<0>;

, но никогда не определяли ее, т. Е. Нет тела.

Возможно, вы хотели написать:

constexpr auto iter(Int<0>) -> Int<0>
{
    return Int<0>{};
}

Но это похоже на проблему XY для меня.Я не понимаю, почему вы хотели бы использовать рекурсию таким образом, когда вместо этого вы можете написать простой цикл в функции constexpr.

...