可以为静态数组的定义提供一个初始化列表。示例:
int main()
{
int int_static[2] = {1,2};
}
动态数组是否可以使用类似的初始化列表?
int main()
{
int* int_ptr = new int[2];
}
这更接近我想要做的:
struct foo
{
foo(){}
foo(void * ptr): ptr_(ptr) {}
void * ptr_;
};
int main()
{
foo* foo_ptr = new foo[10];
}
在初始化时不应该调用默认构造函数,而是 foo:foo(void*)。
动态数组的静态初始值设定项列表在加速器核心的即时编译情况下可能会派上用场,加速器核心的可用堆栈数量有限,但同时您可以构建自己的具有(加速器编译时间 = 主机运行时间)静态初始化列表的对象。
我假设不会(因为这需要编译器生成额外的代码,即将参数的值复制到堆位置)。我认为 c++0x 支持其中的一些,但我不能使用它。 现在我可以使用这样的构造。也许有人知道一个窍门..
最好!
最佳答案
在 OP 发布这个问题时,C++11 支持可能还不是很普遍,这就是为什么接受的答案说这是不可能的。但是,现在所有主要的 C++ 编译器都应该支持使用显式初始化列表初始化动态数组。
语法 new int[3] {1, 2, 3}
在 C++11 中被标准化。引用 new expression cppreference.com 上的页面:
The object created by a new-expression is initialized according to the following rules:
...
If type is an array type, an array of objects is initialized:
...
If initializer is a brace-enclosed list of arguments, the array is aggregate-initialized. (since C++11)
因此,鉴于 OP 的示例,以下内容在使用 C++11 或更新版本时是完全合法的:
foo * foo_array = new foo[2] { nullptr, nullptr };
请注意,通过在初始化列表中提供指针,我们实际上是在诱使编译器应用 foo(void * ptr)
构造函数(而不是默认构造函数),这是所需的行为.
关于c++ - 动态数组的初始化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7124899/