C ++:完美转发的integer_constant无法在编译时使用模板函数进行评估

时间:2019-08-19 14:40:51

标签: c++ templates constexpr perfect-forwarding

我编写了以下函数,该函数在编译时向我返回integral_constant的值,以便可以在具有自动参数的lambas中使用它:

template<typename T, T v> 
constexpr T Index(std::integral_constant<T, v>) { 
  return v; 
}

当使用auto &&作为传递的integer_constant的类型时,此函数失败,我不明白为什么。

我想出了一个替代解决方案,该解决方案比我的原始示例更有效,更通用,但导致编译器错误难以理解:

auto Index2 = [](auto&& constant) { 
  return std::decay_t<decltype(constant)>::value; 
};

现在,我想在lambda中使用这些函数,该lambda传递了integer_constant,但取决于参数i的类型,第一个版本会失败:

int main() {

    auto f = [](auto i) {
        static_assert(Index(i) == 0);
        static_assert(Index2(i) == 0);
    };

    auto f2 = [](auto&& i) {
        static_assert(Index(i) == 0); //non-constant condition for static assertion
        static_assert(Index2(i) == 0);
    };

    f(std::integral_constant<int, 0> {});
    f2(std::integral_constant<int, 0> {});

}

I。 e。我收到编译器错误“静态声明的非恒定条件”,但我不明白为什么。虽然我只使用f这样的lambas是可以的,但我想知道为什么f2不能更好地理解转发引用/ constexpr。

0 个答案:

没有答案