void (* const algorithm)();
和
void const (* const algorithm)();
在处理指向静态方法的const
指针时?
我了解,如果指针指向变量,如this answer所述,则如果指针指向不应修改的内存,则使用const
是有意义的。但是,函数地址在运行时是否仍不能有效地保持不变?
我要问的原因是 second 选项作为函数参数不起作用。
编辑
这是无法编译的代码。
struct A {
static void a() {}
};
void b(void const (* const callback)()) {}
int main() {
b(&A::a); // No matching function for call to 'b'
}
如果函数a()
的返回类型为const void
,则上面的示例有效。
答案 0 :(得分:4)
const
在返回类型之后(或之前)适用于返回类型。没有所谓的“ const函数指针”,因为没有所谓的const函数。 (尽管,存在诸如指向const成员函数的指针之类的东西,因为const成员函数确实存在。但是constness应用于对象参数,而不是函数本身。constness以相同的方式表示就像在成员函数的声明中一样-在带括号的参数列表之后)。
void()
和void const()
在两个函数的行为完全相同的意义上没有区别,因为const无效返回类型和非const无效返回类型之间没有行为上的区别。没有对象时,对象不能为const。
我希望当非类返回值直接用const限定时,编译器会发出警告。
但是,void()
和void const()
在意义上是不同的,void
和void const
在技术上是独立的类型,所有const限定类型都不同于非const类型对方。因此,指向const返回函数和非const返回函数的函数指针是不同的函数指针类型。因此,该标准不允许将指向一种类型的函数指针绑定到另一种类型的函数。
因此,要修复您的非编译代码,只需在函数指针中将void const
替换为void
。
答案 1 :(得分:0)
以“内部” const
开始:
using void_function = void();
void (*p1)() = nullptr; // similar to `void_function* p1 = nullptr;`
void (* const p2)() = nullptr; // similar to `void_function* const p2 = nullptr;`
p2
是constant
,而p1
是可变的。
移动const
时,如下所示:
const void_function* p3 = nullptr; // or void_function const* p3; // -> const has no effect
void (const* p4)() = nullptr; // Invalid syntax
没有“ const
函数”和“可变函数”。
现在,查看函数返回类型:
类型void ()
(函数返回void
和const void ()
(函数返回const void
!?)是不同的。
即使const void
毫无意义,它也是有效的类型。
从函数返回const
对象以禁止对该对象进行“直接”修改可能很有意义:
const std::string make_const_string();
make_const_string().push_back('*'); // Doesn't work
std::string s = make_const_string(); // OK, create mutable copy.
所以要修正您的代码:
struct A {
static void a() {}
};
void b(void const (* const callback)()) {}
int main() {
b(&A::a); // No matching function for call to 'b'
}
您必须使&A::a
与b
的参数类型匹配:
static const void a() {}
void b(void (*const callback)())
我建议使用第二个const void
毫无道理。