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/