复合类型的动态数组
Dynamic array of compound type
是否可以在没有类型别名的情况下做同样的事情?
void f()
{
typedef char Str[16];
int n=256;
Str** p = new Str*[n];
delete[] p;
}
我尝试了以下但没有成功:
// char(**p)[16] = new char(*[n])[16]; // error
// char(**p)[16] = new (char(*[n])[16]); // error
您似乎想创建一个元素类型为 char (*)[16]
的动态数组。不,没有类型别名就无法完成。为了使用动态范围,您需要使用以下形式的 new-expression (C++17 [expr.new]/1):
::
(opt) new
new-placement(opt) new-type-id new-initializer(opt)
但是如果你看一下 new-type-id、new-declarator 和 noptr 的定义-new-declarator,你会看到括号不允许改变运算符的优先级。因此,我们无法在此上下文中显式写下所需的类型。
最佳解决方案:使用 std::vector
。如果你不能这样做(也许你的目标是一些非常有限的独立实现)那么使用 typedef。
是否可以在没有类型别名的情况下做同样的事情?
void f()
{
typedef char Str[16];
int n=256;
Str** p = new Str*[n];
delete[] p;
}
我尝试了以下但没有成功:
// char(**p)[16] = new char(*[n])[16]; // error
// char(**p)[16] = new (char(*[n])[16]); // error
您似乎想创建一个元素类型为 char (*)[16]
的动态数组。不,没有类型别名就无法完成。为了使用动态范围,您需要使用以下形式的 new-expression (C++17 [expr.new]/1):
::
(opt)new
new-placement(opt) new-type-id new-initializer(opt)
但是如果你看一下 new-type-id、new-declarator 和 noptr 的定义-new-declarator,你会看到括号不允许改变运算符的优先级。因此,我们无法在此上下文中显式写下所需的类型。
最佳解决方案:使用 std::vector
。如果你不能这样做(也许你的目标是一些非常有限的独立实现)那么使用 typedef。