c ++如何将constexpr值与operator []一起使用
c++ how to use constexpr value with operator []
问题的根源是我想在模板非类型参数中使用 const char*
或 char []
。当然现在不支持了。所以我想写一些代码把char[]
转换成std::integer_sequence
。但是我发现一个严重的问题。
#include<utility>
template<typename T, std::size_t n>
constexpr auto f3(T (&a)[n])
{
return std::integer_sequence<T,a[0]>(); //simplified, it should be <T, a[i],...>
}
template<typename T, std::size_t n>
constexpr auto f2(T (&a)[n])
{
constexpr T v=a[3];
//.....other code
return v;
}
template<typename T, std::size_t n>
constexpr auto f1(T (&a)[n])
{
return a[3];
}
int main()
{
constexpr char a[]="abcdefg";
constexpr auto v1=f1(a);
//constexpr auto v2=f2(a);
//constexpr auto v3=f3(a);
}
f1 没问题,但 f2 和 f3 不对。我一头雾水.....这是为什么呢?
看起来只有“return xxx[yyy]”在编译时是可以的。我无法将其存储在值中或将其传递给其他函数。
constexpr
函数可能会在非 constexpr 上下文中调用,因此参数永远不会是 constexpr:
a
不是 constexpr
,因此 f2
/f3
不能在 constexpr
上下文中使用它。
f1
很好,a[3]
不用于 constexpr
上下文。
并且 f1
可以在具有适当参数的常量表达式中使用。
问题的根源是我想在模板非类型参数中使用 const char*
或 char []
。当然现在不支持了。所以我想写一些代码把char[]
转换成std::integer_sequence
。但是我发现一个严重的问题。
#include<utility>
template<typename T, std::size_t n>
constexpr auto f3(T (&a)[n])
{
return std::integer_sequence<T,a[0]>(); //simplified, it should be <T, a[i],...>
}
template<typename T, std::size_t n>
constexpr auto f2(T (&a)[n])
{
constexpr T v=a[3];
//.....other code
return v;
}
template<typename T, std::size_t n>
constexpr auto f1(T (&a)[n])
{
return a[3];
}
int main()
{
constexpr char a[]="abcdefg";
constexpr auto v1=f1(a);
//constexpr auto v2=f2(a);
//constexpr auto v3=f3(a);
}
f1 没问题,但 f2 和 f3 不对。我一头雾水.....这是为什么呢? 看起来只有“return xxx[yyy]”在编译时是可以的。我无法将其存储在值中或将其传递给其他函数。
constexpr
函数可能会在非 constexpr 上下文中调用,因此参数永远不会是 constexpr:
a
不是 constexpr
,因此 f2
/f3
不能在 constexpr
上下文中使用它。
f1
很好,a[3]
不用于 constexpr
上下文。
并且 f1
可以在具有适当参数的常量表达式中使用。