Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-不能';新';尽管已初始化大括号列表,但大小未知的数组?_C++_Arrays_Dynamic Allocation - Fatal编程技术网

C++ C++;-不能';新';尽管已初始化大括号列表,但大小未知的数组?

C++ C++;-不能';新';尽管已初始化大括号列表,但大小未知的数组?,c++,arrays,dynamic-allocation,C++,Arrays,Dynamic Allocation,前言: 关于这个问题我什么也没发现。我发现的唯一一件事是人们动态地分配数组,而不提供任何关于所述数组大小的信息,如int*p=newint[] 我的问题不同: float arr[]{ 1,2,3 }; float* p = new float[]{1, 2, 3}; 第一行编译得很好,第二行编译得不好: 错误C3078必须在新表达式中指定数组大小 我想知道:为什么编译器没有像在第一种情况下那样从列表初始化计算数组大小?它只是…没有。它没有语法 你可以在那里找到一个基本原理,动态内存通常由动态

前言:

关于这个问题我什么也没发现。我发现的唯一一件事是人们动态地分配数组,而不提供任何关于所述数组大小的信息,如
int*p=newint[]

我的问题不同:

float arr[]{ 1,2,3 };
float* p = new float[]{1, 2, 3};
第一行编译得很好,第二行编译得不好:

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


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

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


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

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

void* operator new[] (std::size_t size);
您可以在其中找到一个基本原理,即动态内存通常由动态长度的动态数据填充(否则,除非只是因为它很大,为什么要使用动态分配?),因此,对请求空间大小的静态推断可能是很少使用的边缘情况

void* operator new[] (std::size_t size);
需要明确的大小。您可以定义自己的运算符以获取初始化器列表

正如一位评论员所说,std::vector通常是首选方法,但我猜您对该语言的技术细节感兴趣,这就是为什么您会问这个问题

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


正如一位评论员所说,std::vector通常是首选方法,但我猜您对该语言的技术细节感兴趣,这就是您提出此问题的原因。

我认为这是一个完全合理的问题,而且碰巧,由于
运算符的定义性质,这是对它的限制

下面的内容确实是精心设计的,但如果您确实希望避免显式说明动态分配阵列的大小,则可以对您起作用:

template<typename T, T ... args>
T* createArray()
{
    return new T[sizeof...(args)]{args...};
}
模板
T*createArray()
{
返回新的T[sizeof…(args)]{args…};
}
然后:

int*arr=createArray();

我认为这是一个完全合理的问题,而且由于
新的
运算符的定义性质,这是对它的一个限制

下面的内容确实是精心设计的,但如果您确实希望避免显式说明动态分配阵列的大小,则可以对您起作用:

template<typename T, T ... args>
T* createArray()
{
    return new T[sizeof...(args)]{args...};
}
模板
T*createArray()
{
返回新的T[sizeof…(args)]{args…};
}
然后:

int*arr=createArray();

我正在读比亚恩·斯特劳斯塔普的书《编程…》 在第17章第597页,比亚恩明确指出:

double* p5 = new double[] {0,1,2,3,4}
在下面的段落中:“……当提供一组元素时,可以省略元素的数量。”


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

我正在读比亚恩·斯特劳斯特鲁普的书《编程…》 在第17章第597页,比亚恩明确指出:

double* p5 = new double[] {0,1,2,3,4}
在下面的段落中:“……当提供一组元素时,可以省略元素的数量。”


所以在我看来,这个问题似乎是因为编译器的糟糕实现,不是吗?

std::vector p={1,2,3}
:)我们不喜欢这里的任意约束——让你自己的生活变得困难,也让我们的生活变得困难@我刚发了一个问题。如果这让你的生活更艰难,你可以忽略我的问题。@gedamial:如果你在寻求免费帮助时失去了对抗的态度,你在这里会过得更好。@Lightness RaceSinorbit如果我问了一个具体的问题,你告诉我我让你的生活复杂化了,我看不出你有理由考虑我的问题。这只是一个提示(我们不喜欢这里的任意约束——让你自己的生活变得困难,你也让我们的生活变得困难@我刚发了一个问题。如果这让你的生活更艰难,你可以忽略我的问题。@gedamial:如果你在寻求免费帮助时失去了对抗的态度,你在这里会过得更好。@Lightness RaceSinorbit如果我问了一个具体的问题,你告诉我我让你的生活复杂化了,我看不出你有理由考虑我的问题。这只是向我展示了新运营商的实施情况,你完美地回答了我的问题;)不过,我不确定这是否是一个很好的理由。即使是非数组
操作符new
也需要一个大小,这由编译器自动确定。为什么编译器不能为OP的情况推断出它呢?如果可以通过“用户定义的参数放置新”(
operator new[](size\u t,…)
)来显示它在标准中的一个忽略点?通过向我展示新操作符的实现,您已经完全回答了我的问题;)不过,我不确定这是否是一个很好的理由。即使是非数组
操作符new
也需要一个大小,这由编译器自动确定。为什么编译器不能为OP的情况推断出它呢?如果它可以通过“用户定义参数放置新”(
运算符新[](size\u t,…)
),那么它看起来像是标准中的一个疏忽?非常感谢向我展示模板函数替代方案;)非常感谢您向我展示模板函数替代项;)