const void(*功能)

时间:2018-10-19 15:55:53

标签: c++ function-pointers const-pointer

之间是否有区别?

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,则上面的示例有效。

2 个答案:

答案 0 :(得分:4)

const在返回类型之后(或之前)适用于返回类型。没有所谓的“ const函数指针”,因为没有所谓的const函数。 (尽管,存在诸如指向const成员函数的指针之类的东西,因为const成员函数确实存在。但是constness应用于对象参数,而不是函数本身。constness以相同的方式表示就像在成员函数的声明中一样-在带括号的参数列表之后)

void()void const()在两个函数的行为完全相同的意义上没有区别,因为const无效返回类型和非const无效返回类型之间没有行为上的区别。没有对象时,对象不能为const。

我希望当非类返回值直接用const限定时,编译器会发出警告。

但是,void()void const()在意义上是不同的,voidvoid 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;`

p2constant,而p1是可变的。

移动const时,如下所示:

const void_function* p3 = nullptr; // or void_function const* p3; // -> const has no effect
void (const* p4)() = nullptr;      // Invalid syntax

没有“ const函数”和“可变函数”。

现在,查看函数返回类型:

类型void ()(函数返回voidconst 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::ab的参数类型匹配:

  • static const void a() {}
  • void b(void (*const callback)())

我建议使用第二个const void毫无道理。