使用 typeof 和 decltype 定义数组时出现编译器错误

Zos*_*oso 5 c++ typeof decltype

A)这有效:

int main() {
    int * a = new int[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

B)这个错误:

int main() {
    int * a = new typeof(*a)[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

出现错误:数组下标的类型“int[int]”无效

C)这有效:

int main() {
    int * a = new typeof(a)[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么 B 失败,因为扩展后的语句应该如下所示:

int *a = new int[5];
Run Code Online (Sandbox Code Playgroud)

因为typeof(*a)是 int。

这是 decltype 的实验:

D)这不起作用:

int main() {
    int * a = new decltype(a)[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

出现错误:无法在初始化时将 'int**' 转换为 'int*'。这是预期的,因为 decltype(a) 是 int*,因此它转换为int *a = new int*[5];不正确的。

E)但这不起作用:

int main() {
    int * a = new decltype(*a)[5];
    delete[] a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

出现错误:new 无法应用于引用类型

因此,无论是 GCC 扩展还是标准 C++11 功能,两者似乎都没有在所有情况下都按照我的预期工作。

Ang*_*gen 1

*a 是一个指向 int 的指针,因此不能以这种方式调用 typeof

int *a = new int[5];
Run Code Online (Sandbox Code Playgroud)

之所以有效,是因为您要显示整数并在 a 显示的位置声明大小为 5 的新数组

也许你想要:

typeof(new typeof(int *)[5])a;
Run Code Online (Sandbox Code Playgroud)

反而

 int * a = new typeof(*a)[5];
Run Code Online (Sandbox Code Playgroud)