考虑以下示例(godbolt):
#include <iostream>
template <typename T>
const T *as_const(T *p) { return p; }
void f() {}
template <typename T>
void g(T *) { std::cout << "A"; }
template <typename T>
void g(const T *) { std::cout << "B"; }
int main() {
g(as_const(&f));
}
Run Code Online (Sandbox Code Playgroud)
GCC和Clang都可以编译它,但生成的可执行文件产生不同的输出:用GCC打印编译的版本A和用Clang打印编译的版本B.
你能解释一下这个区别吗?
更新:正如@VTT指出的那样,即使as_const被删除也会观察到相同的差异.
我需要声明一个指向函数的指针数组,如下所示:
extern void function1(void);
extern void function2(void);
...
void (*MESSAGE_HANDLERS[])(void) = {
function1,
function2,
...
};
Run Code Online (Sandbox Code Playgroud)
但是,我希望将数组声明为常量 - 数组中的数据和指向数据的指针.不幸的是,我不记得在哪里放置const关键字.
我假设在这种情况下,实际指针MESSAGE_HANDLERS已经是常量,因为它被声明为数组.另一方面,如果声明如图所示,那么数组中的函数指针是否可以在运行时更改?