c++如何将constexpr值与运算符[]一起使用
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);
}
https://godbolt.org/z/E5YPTM
f1是可以的,但是f2&f3是错误的。我搞糊涂了。。。。。为什么?看起来只有";return xxx[yyy]"在编译时是可以的。我不能将它存储在值中,也不能将它传递给其他函数。
constexpr
函数可能在非constexpr上下文中调用,因此参数永远不是constexpr:
a
不是constexpr
,因此f2
/f3
不能在constexpr
上下文中使用它。
f1
很好,a[3]
不用于constexpr
上下文。并且CCD_ 14可以用在具有适当自变量的常数表达式中。
相关文章:
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 [][] 运算符与向量一起使用?
- 不能将重载比较运算符与 Catch 测试一起使用
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 为什么我不能将运算符+与reverse_iterator一起使用?
- 将流运算符与Template类一起使用
- 让类与运算符一起工作更简单的方法
- 将运算符<<与隐式转换的非基本数据类型一起使用时出错
- 为什么重载运算符不与 std::string 一起使用 msvc /MD 标志
- #define 与运算符一起使用
- 将赋值运算符与make_pair方法一起使用会生成 CLion 警告
- 是否可以将引用类型别名与指针运算符一起使用来声明对指针的引用?
- 返回对象如何与分配运算符一起工作
- 将逻辑 OR 与 cout 运算符一起使用
- 如何将模运算符与其他数据类型一起使用
- 为什么在 sizeof() 函数中与 * 运算符一起使用和不使用 * 运算符时,指向结构变量的指针大小会有所不同?
- 将[]运算符与链接列表一起使用
- 将赋值运算符与 unique_ptr 向量一起使用
- 我可以将 std:fixed 或 std::setprecision() 与>>运算符一起使用吗?
- 在C++中,我们如何将插入运算符和其他运算符链接在一起