c++ - func 指针的 const 数组令人困惑

标签 c++ arrays

void process( int boat ) { ; }

const void(*sequence_A[])( int ) = { process, process }; //ERROR
const void(**func_sequence)( int ) = sequence_A;

(*func_sequence++)( 7 );

为什么不能编译?我希望 const 引用数组,而不是数组的内容。

Error   1   error C2440: 'initializing' : cannot convert from 'void (__cdecl *)(int)' to 'const void (__cdecl *)(int)'

编辑:所以你们说它不存在。很公平。为了清楚起见,我发布了我想要的功能的类比,但这是使用 int 而不是函数 ptrs

    //Compiles without error
int number1 = 7;
int number2 = 3;
const int* sequence_B[] = { &number1, &number2 };
const int** numbers = sequence_B;

int check = **numbers++; //value is 7
int chec2 = **numbers++; //value is 3

最佳答案

好吧,我们来分析一下你这句话的意思

 const void(*sequence_A[])( int ) = { process, process }; //ERROR

我记得 *x[] 的解析方式是 main 的第二个参数是 char* argv[],所以,它是一个指针数组。也就是说,要对sequence_A进行索引,然后对结果进行解引用。

然后,您可以为此应用一个带有 int 值的函数调用参数括号,结果您应该得到一个......

const void ?

嗯,这并不完全有意义。您可以有一个指向 const void 的指针,但您不能取消引用该指针:您不能直接“获取”const void。然而这里有一些指向函数的指针,该函数产生作为其表达式值 const void

匹配你需要的

const void process( int boat ) { ; }

虽然我没有尝试过,但我怀疑任何编译器都会接受它。 [更新:事实证明,至少 g++ 接受它,所以这是一个解决方案。但这是一个非常非常规的函数签名。根本不是你想要的!]

简而言之,删除那个 const


相关说明,正如评论中已经提到的,您不能拥有 const 原始数组,除非是 const 项目的原始数组。

这是该语言的一种极端情况,一种从 C 继承而来的有问题的类型系统异常。

随着数组类型衰减为指针,也有问题。


附录:如何使数组项const的示例:

void process( int boat ) { ; }

int main()
{
    void(* const sequence_A[])( int ) = { process, process };   // OK
    //sequence_A[0] = process;     //ERROR
}

关于c++ - func 指针的 const 数组令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22164944/

相关文章:

c++ - Netbeans 6.9.1 在 Ubuntu 上查找库时出现问题

c++ - 类c++头文件的重新定义

Javascript 在数组中存储多个字段

c# - 如果 A 和 B 是枚举类型,为什么我可以将 A[] 转换为 B[]?

arrays - 如果 Scala 中需要不可变数组,返回 IndexesSeq 而不是 Array 是否正确?

将局部变量复制到全局变量时,C++ GCC 优化速度变慢

c++ - VSCode 终端 ctrl-click in out of source build 找不到文件

c++ - 滚动一个非常大的 GtkDrawingArea

php - 多维数组输出。请帮我提取并遍历这个烂摊子

c - 在 C 中使用函数返回结构数组