c ++ 14模板专门化“已使用但从未定义”

时间:2019-02-18 11:53:46

标签: c++ templates c++14 warnings constexpr

要定义编译时递归的模板,我必须定义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 :(得分:7)

您已经声明了函数

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

但您从未定义它,即没有主体。

也许你想写:

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

但这对我来说似乎是XY问题。当您可以在constexpr函数中编写一个简单的循环时,我看不到为什么要使用这种递归。