我可以用 constexpr 函数声明一个静态数组吗

Posted

技术标签:

【中文标题】我可以用 constexpr 函数声明一个静态数组吗【英文标题】:can I declare a static array with constexpr function 【发布时间】:2018-08-08 08:25:48 【问题描述】:
// since we can dedfine a static array like this
int a[5] = 0;
// decltype(a[5]) is `int [5]`

// Then how about this way?
constexpr int sum(int a, int b)  return a + b; 
int a, b;
std::cin >> a >> b;
int arr[sum(a, b)] = 0;

可以编译成功,但是arr是静态数组吗? 当我尝试使用typeid().name()boost::typeindex::type_id_with_cvr 打印arr 类型时,出现以下错误:

error: cannot create type information for type 'int [(<anonymous> + 1)]' because it involves types of variable size
 std::cout << typeid(decltype(arr)).name() << std::endl;

【问题讨论】:

除非你标记为静态数组,否则它不是静态数组。 a 和 b 也应该是 const。 声明一个数组,其大小由sum 调用产生,要求它在编译时 被调用,因为函数sum 在编译时被评估为两个参数都是必需的在编译时知道。 【参考方案1】:

由于ab 的值在编译时未知,sum 的结果不是 constexpr。

代码编译可能是因为您使用的是 GCC,它有一个扩展允许在堆栈上声明具有可变大小的数组,标准 c++ 不允许这样做。

【讨论】:

请注意,这些称为可变长度数组 (VLA):gcc.gnu.org/onlinedocs/gcc/Variable-Length.html。您可以使用-Werror=vla:wandbox.org/permlink/iJtZ5nmyDTaxFW2E 使用 GCC 禁用它们。

以上是关于我可以用 constexpr 函数声明一个静态数组吗的主要内容,如果未能解决你的问题,请参考以下文章

静态常量整数数组

为啥**不**将函数声明为`constexpr`?

在另一个函数中前向声明“constexpr”函数——编译器错误?

为啥这个 constexpr 静态成员函数在调用时不被视为 constexpr?

对静态 constexpr 数据成员的未定义引用错误

未定义的对静态constexpr char []的引用