gpt4 book ai didi

c++ - 这些带有 char 数组的新表达式中哪些是格式良好的?

转载 作者:行者123 更新时间:2023-12-01 13:17:24 28 4
gpt4 key购买 nike

对于以下 program :

int main() 
{
new char[4] {"text"}; // #1
new char[5] {"text"}; // #2
new char[] {"text"}; // #3
}
clang 给出了 #1 的错误其中说:
error: initializer-string for char array is too long
并接受 #2#3 .
gcc 为所有语句给出以下错误:
error: invalid conversion from 'const char*' to 'char' [-fpermissive]
此外还有 #3它给出了错误:
error: expected primary-expression before ']' token
那么该语言对这段代码是否格式良好有什么看法呢?
我想知道当前的规则,但我也很想知道这是否在该语言的先前版本中发生了变化。

最佳答案

好的,这很容易追踪。 {}的存在意味着正在执行列表初始化,因此我们可以访问规范中我们最喜欢的部分:[dcl.init.list]/3 .
在情况 1 中被初始化的对象是 char[4] .花括号初始化器列表不是指定的初始化器,因此 3.1 被忽略。 char[4]不是一个类,所以 3.2 被忽略。那个brings us to 3.3 :

Otherwise, if T is a character array and the initializer list has a single element that is an appropriately-typed string-literal ([dcl.init.string]), initialization is performed as described in that subclause.


那么, char[4]肯定是字符数组,并且初始化列表肯定包含单个元素,并且该元素实际上与字符数组的类型匹配。所以去 [dcl.init.string]我们去。
这告诉我们(在时尚之后):

Successive characters of the value of the string-literal initialize the elements of the array.


但下一段警告:

There shall not be more initializers than there are array elements.


好吧,这使得 #1 格式错误。
所以,我们重做 char[5] 的过程.这不会触发,因为 5 足够大。
最后,我们来到 char[] .就初始化而言,这与使用数字没有什么不同。 char[]是一个字符数组,所以它遵循上述规则。 C++17 会窒息使用 char[]new表达式,但是 C++20 is fine with it .

If the type-id or new-type-id denotes an array type of unknown bound ([dcl.array]), the new-initializer shall not be omitted; the allocated object is an array with n elements, where n is determined from the number of initial elements supplied in the new-initializer ([dcl.init.aggr], [dcl.init.string]).


这意味着#2 和#3 应该是合法的。所以 GCC 使它们格式错误是错误的。由于错误的原因,它使 #1 格式错误。

关于c++ - 这些带有 char 数组的新表达式中哪些是格式良好的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63551203/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com