我可以用 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】:
由于a
和b
的值在编译时未知,sum
的结果不是 constexpr。
代码编译可能是因为您使用的是 GCC,它有一个扩展允许在堆栈上声明具有可变大小的数组,标准 c++ 不允许这样做。
【讨论】:
请注意,这些称为可变长度数组 (VLA):gcc.gnu.org/onlinedocs/gcc/Variable-Length.html。您可以使用-Werror=vla
:wandbox.org/permlink/iJtZ5nmyDTaxFW2E 使用 GCC 禁用它们。以上是关于我可以用 constexpr 函数声明一个静态数组吗的主要内容,如果未能解决你的问题,请参考以下文章
在另一个函数中前向声明“constexpr”函数——编译器错误?