当前位置: 首页 > 知识库问答 >
问题:

为什么 const 数组无法从 constexpr 函数访问?

朱鹤轩
2023-03-14

我有一个名为access的constexpr函数,我想访问数组中的一个元素:

char const*const foo="foo";
char const*const bar[10]={"bar"};

constexpr int access(char const* c) { return (foo == c); }     // this is working
constexpr int access(char const* c) { return (bar[0] == c); }  // this isn't
int access(char const* c) { return (bar[0] == c); }            // this is also working

我得到的错误是:

error: the value of 'al' is not usable in a constant expression

为什么我不能从access访问其中一个元素?或者如果可能的话,我该怎么做?

共有1个答案

陈允晨
2023-03-14

数组需要声明为constexpr,而不仅仅是常量

constexpr char const* bar[10]={"bar"};

否则,表达式< code>bar[0]会执行左值到右值的转换,以取消对数组的引用。根据C 11 5.19/2,第九个项目符号,除非数组是< code>constexpr,否则它不能作为常量表达式:

左值到右值的转换,除非它应用于

  • 文本类型的 gl值,它引用使用 constexpr 定义的非易失性对象

(以及其他一些不适用的例外情况)。

 类似资料:
  • 和之间有什么区别? 什么时候我只能使用其中一个

  • 在C中,您可以将许多内容声明为:变量、函数(包括成员函数和运算符)、构造函数,以及从C 1z开始的语句和lambda表达式。但是,声明析构函数会导致错误: 我的问题: 为什么不能将析构函数标记为constexpr 如果我没有提供析构函数,那么隐式生成的析构函数是constexpr吗 如果我声明一个默认析构函数(

  • 为什么 C 编译器可以将函数声明为 constexpr,而 constexpr 不能是 constexpr? 例如:http://melpon.org/wandbox/permlink/AGwniRNRbfmXfj8r 输出: 为什么此行出错:

  • 我遇到了我不明白的情况。有人能很好地解释为什么第一个代码编译正确,而第二个代码出错: 错误:“TestClass::z”的值在常量表达式中不可用。} - ^ 注意:“int TestClass::z”不是const static int z;" 工作代码: 但是当我尝试使 静态时,我得到上述错误: 附言:我正在使用mingw32-g 4.8.1

  • 问题内容: 我有一个类型为C的C文件,可以这样称呼它,例如: 我需要使用Go转到该C数组的索引,并将数组项转换为Go字符串。以下代码可以编译,但不能正常运行;您可以从下面的输出中看到,它是沿着字符串而不是数组进行索引: …结果是这样的: 仅供参考,这样做的目的是在服务器上解码在运行C的嵌入式平台上创建的日志文件,因此需要重新使用相同的日志记录索引文件。 我已经随机刺了几个小时,但没有成功。谁能纠正

  • 然而,这是不正确的: 但这很好: 请解释为什么对于无效?这是否是不必要的添加&任何声明为的内容都假定为或类似的内容?