我编写了以下函数,该函数在编译时向我返回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。