【发布时间】:2023-04-03 12:25:01
【问题描述】:
我想动态分配一个函数指针数组。以下是我的一些尝试:
#include <type_traits>
void f(int n) {
// auto p1 = new void(*[n])(); // syntax error
auto p2 = new (void(*[n])()); // warning, see below
auto p3 = new typeof(void(*)())[n]; // non-standard extension
using fptr = void(*)(); auto p4 = new fptr[n]; // verbose, but okay
auto p5 = new std::add_pointer_t<void()>[n]; // hackish
}
我想知道为什么p2 会导致警告,因为我不能在没有括号的情况下编写它(例如在p1 中)?
(gcc) 警告:必须指定非常量数组的新长度 类型 ID [-Wvla]
周围的括号(clang) 警告:当类型在括号中时,数组不能有 动态大小
这是一个纯粹的理论问题。我不是在寻找如何编写好的代码来解决问题的建议。
【问题讨论】:
-
auto p6 = std::vector<std::function<void()>>();怎么样? -
你说“太冗长”的地方,我会说“最容易阅读”
-
@Eljay 是的,这与我在实践中会写的很接近。不过,我的问题纯粹是理论上的。
标签: c++ gcc syntax clang language-lawyer