const void (* 函数)

const void (* to function)

有什么区别吗:

void (* const algorithm)();

void const (* const algorithm)();

当处理const指向静态方法的指针时?

我理解如果指针指向不应修改的内存,使用 const 是有意义的,在指向变量的指针的情况下,如 this answer 中所述。然而,函数地址在 运行 时间内不是有效的常数吗?

我问这个的原因是,作为函数参数的 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() 具有 return 类型 const void.

,则以上示例有效

const 在 return 类型之后(或之前)适用于 return 类型。没有 "pointer to const function" 这样的东西,因为没有 const 函数这样的东西。 (虽然,存在指向 const 成员函数的指针,因为 const 成员函数确实存在。但是常量适用于对象参数,而不适用于函数本身。常量表示在与成员函数的声明相同 - 在带括号的参数列表之后).

void()void const() 之间没有区别,因为两个函数的行为完全相同,因为 const void return 类型和非 const void return 类型之间没有行为差异-const void return 类型。当没有对象时,对象不能是常量。

我希望编译器在非class return 值直接用 const 限定时发出警告。

但是,void()void const() 的不同之处在于 voidvoid const 在技术上是不同的类型,因为所有 const 限定类型都不同于它们的非-const 对应物。因此指向 const returning 和非 const returning 函数的函数指针是不同的函数指针类型。因此,该标准不允许将指向一种类型的函数指针绑定到另一种类型的函数。

因此,要修复您的非编译代码,只需在函数指针中将无意义的 void const 替换为 void

从 "inner" 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;`

p2constantp1 是可变的。

移动const时,如下:

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

没有“const 函数”与 "mutable function"。

现在,查看函数 return 类型:

类型void ()(函数returning void)和const void ()(函数returning const void !?)是不同的。

即使 const void 没有实际意义,它也是一个有效类型。

从函数 return const 对象禁止 "direct" 修改对象可能有意义:

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 没有实际意义。