【问题标题】:why is a const array not accessible from a constexpr function?为什么不能从 constexpr 函数访问 const 数组?
【发布时间】:2013-09-19 01:40:19
【问题描述】:

我有一个名为 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 中访问其中一个元素?或者如果可能的话,我该怎么做?

【问题讨论】:

  • 有效吗?还是不行?
  • @MikeSeymour 好的,我不懂 C++ 我应该删除评论吗?
  • @GrijeshChauhan 对不起,不,它不起作用。我的方法在没有constexpr 的情况下有效。

标签: c++ c++11 constexpr


【解决方案1】:

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

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

否则,表达式bar[0] 将执行左值到右值的转换以取消对数组的引用。根据 C++11 5.19/2,第九个项目符号,除非数组是 constexpr,否则这将使其无法成为常量表达式:

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

  • 一个字面量类型的左值,它引用一个用 constexpr 定义的非易失性对象

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

【讨论】:

  • 现在有趣的问题是,为什么它适用于非数组版本,即使它只是 const 而不是 constexpr
  • @us2012:我不确定确切的规则;我认为您可以使用const 值(包括foo 之类的指针),但不能使用表达式的结果(例如bar[0]),除非所有子表达式都是constexpr。什么的。
  • @us2012:我想我现在找到了相关规则。
  • 那么如何访问数组元素 - 这太搞笑了。
猜你喜欢
  • 2020-12-03
  • 1970-01-01
  • 2017-12-17
  • 2012-11-17
  • 2012-06-17
  • 1970-01-01
  • 2011-07-03
  • 2017-04-15
  • 1970-01-01
相关资源
最近更新 更多