C++ - 尽管进行了 Braced-List 初始化,但仍不能 'new' 未知大小的数组?
C++ - Cannot 'new' an array on unknown size in spite of Braced-List initialization?
前言:
我没有找到关于此问题的任何信息。我发现的唯一一件事是人们动态分配一个数组而不提供任何关于所述数组大小的信息,就像这样 int* p = new int[];
我的问题不同:
float arr[]{ 1,2,3 };
float* p = new float[]{1, 2, 3};
第一行编译正常,第二行没有:
Error C3078 Array size must be specified in new expressions
我想知道:为什么编译器不像第一种情况那样从列表初始化中评估数组大小?
它只是……没有。没有语法。
你可以在某处找到一个基本原理,动态内存通常由动态长度的动态数据填充(否则,除非只是因为它很大,否则你为什么要使用动态分配?)和静态推导因此,请求的大小 space 可能是很少使用的边缘情况。
void* operator new[] (std::size_t size);
明确要求大小。您可以定义自己的运算符来获取初始化列表。
正如一位评论员所说,std::vector 通常是首选方法,但我猜您对语言的技术细节感兴趣,这就是您提问的原因。
我认为这是一个非常合理的问题,而且由于 new
运算符定义的性质,这是对它的限制。
下面的内容确实是人为设计的,但如果您真的想避免显式声明动态分配数组的大小,则可能对您有用:
template<typename T, T ... args>
T* createArray()
{
return new T[sizeof...(args)]{args...};
}
然后:
int* arr = createArray<int, 1, 2, 3>();
我正在读 Bjarne Stroustrup 的书 "Programming...."
在第 17 章第 597 页中,Bjarne 明确表示:
double* p5 = new double[] {0,1,2,3,4}
并在下面的段落中:“...当提供一组元素时,可以省略元素的数量。”
所以对我来说,这个问题似乎是因为编译器的错误实现,不是吗?
前言:
我没有找到关于此问题的任何信息。我发现的唯一一件事是人们动态分配一个数组而不提供任何关于所述数组大小的信息,就像这样 int* p = new int[];
我的问题不同:
float arr[]{ 1,2,3 };
float* p = new float[]{1, 2, 3};
第一行编译正常,第二行没有:
Error C3078 Array size must be specified in new expressions
我想知道:为什么编译器不像第一种情况那样从列表初始化中评估数组大小?
它只是……没有。没有语法。
你可以在某处找到一个基本原理,动态内存通常由动态长度的动态数据填充(否则,除非只是因为它很大,否则你为什么要使用动态分配?)和静态推导因此,请求的大小 space 可能是很少使用的边缘情况。
void* operator new[] (std::size_t size);
明确要求大小。您可以定义自己的运算符来获取初始化列表。
正如一位评论员所说,std::vector 通常是首选方法,但我猜您对语言的技术细节感兴趣,这就是您提问的原因。
我认为这是一个非常合理的问题,而且由于 new
运算符定义的性质,这是对它的限制。
下面的内容确实是人为设计的,但如果您真的想避免显式声明动态分配数组的大小,则可能对您有用:
template<typename T, T ... args>
T* createArray()
{
return new T[sizeof...(args)]{args...};
}
然后:
int* arr = createArray<int, 1, 2, 3>();
我正在读 Bjarne Stroustrup 的书 "Programming...." 在第 17 章第 597 页中,Bjarne 明确表示:
double* p5 = new double[] {0,1,2,3,4}
并在下面的段落中:“...当提供一组元素时,可以省略元素的数量。”
所以对我来说,这个问题似乎是因为编译器的错误实现,不是吗?