为什么新建数组时不能指定构造函数?

xml*_*lmx 5 c++ arrays constructor initialization c++11

更新:

上面的链接和下面的答案没有回答为什么这个功能没有标准化.这才是让我惊讶的原因.请考虑性能问题之间std::vector<A> arr(8, 7);new A[8](7);:

如果我们使用std::vector<A> arr(8, 7);它可能(不一定)实现如下:

this->internal_buf = new A[8]; // Call default constructor A() 8 times!
for (auto i = 0; i < 8; ++i)
{
    this->internal_buf[i] = A(7); // Call constructor A(7) 8 times AGAIN!!!
}
Run Code Online (Sandbox Code Playgroud)

如果C++支持new A[8](7);它可以实现如下:

A* arr = (A*)malloc(sizeof(A) * 8 + extra_size);

for (auto i = 0; i < 8; ++i)
{
    new (&arr[i]) A(7); // Call constructor A(7) 8 times ONLY.
}
Run Code Online (Sandbox Code Playgroud)

比较这两种方法,很明显,new A[8](7);更快std::vector<A> arr(8, 7);

此外,我也觉得比new A[8](7);它更简洁,更富有表现力std::vector<A> arr(8, 7);

无论如何,我认为C++应该为程序员提供另一种替代工具,例如这个功能.因为C++哲学之一是"尽可能多地为你提供工具,但你不需要付出你不需要的东西."

以下是原帖:

struct A
{
    int n;
    A() : n() {}
    A(int n) : n(n) {}
};

int main()
{
    new A[8];    // OK
    new A[8]();  // OK
    new A[8](7); // Error
}
Run Code Online (Sandbox Code Playgroud)

为什么新建数组时不能指定构造函数?

为什么C++标准不支持这样一个方便的功能?理由是什么?

Ale*_*lex 1

对于 C++11 之前的版本,您可以执行以下操作:

new A[8]{ A(7), A(7), A(7), A(7), A(7), A(7), A(7), A(7) };
Run Code Online (Sandbox Code Playgroud)

  • @xmllmx 什么更优雅?*这*更“优雅”:`std::vector&lt;A&gt; arr(8, {7});` (7认同)
  • 事实上,您_可以_指定构造函数。为什么没有语法糖来用相同的参数初始化所有元素是另一个故事。可能没有人想让 C++ 解析变得比现在更复杂。 (2认同)