C ++ - 尽管有Braced-List初始化,但是不能'new'一个未知大小的数组?

时间:2016-07-01 11:07:20

标签: c++ arrays dynamic-allocation

前言:

我对此问题一无所知。我发现的唯一一件事是人们动态分配数组而不提供有关所述数组大小的任何信息,例如int* p = new int[];

我的问题不同:

float arr[]{ 1,2,3 };
float* p = new float[]{1, 2, 3};

第一行编译正常,第二行编译不正确:

  

错误C3078 必须在新表达式中指定数组大小

我想知道:为什么编译器没有像第一种情况那样从列表初始化中评估数组大小?

4 个答案:

答案 0 :(得分:4)

void* operator new[] (std::size_t size);

明确要求大小。您可以定义自己的运算符以获取初始化列表。

正如评论员所说,std :: vector通常是首选的方法,但我想你对这种语言的技术性感兴趣,这就是你问的原因。

答案 1 :(得分:3)

我认为这是一个非常合理的问题,而且恰好由于new运算符的定义性质,这是对它的限制。

以下是真正的设计,但如果您真的想避免明确说明动态分配的数组的大小,那么可能对您有用:

template<typename T, T ... args>
T* createArray()
{
    return new T[sizeof...(args)]{args...};
}

然后:

int* arr = createArray<int, 1, 2, 3>();

答案 2 :(得分:1)

我正在阅读Bjarne Stroustrup的书“编程......” 在第17章第597页中,Bjarne明确地说:

Function FormatCell()

并在下面的段落中:“......当提供一组元素时,可以省略元素的数量。”

所以对我来说似乎这个问题是因为编译器执行不好,不是吗?

答案 3 :(得分:0)

它只是......没有。它没有语法。

你可以在那里找到一个基本原理,动态内存通常由动态长度的动态数据填充(否则,除非因为它很大,你为什么使用动态分配?)和静态推导的大小因此,所请求的空间很可能是一个很少使用的边缘情况。