1

有什么区别:

void (* const algorithm)();

void const (* const algorithm)();

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

const我知道,如果指针指向不应修改的内存,则使用指向变量的指针是有意义的,如this answer中所述。但是,函数地址在运行时不是有效地保持不变吗?

我问这个的原因是,作为函数参数的第二个选项不起作用。

编辑

这是无法编译的代码。

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

4

2 回答 2

4

const返回类型之后(或之前)适用于返回类型。没有“指向 const 函数的指针”之类的东西,因为没有 const 函数之类的东西。(尽管存在指向 const 成员函数的指针之类的东西,因为确实存在 const 成员函数。但是 constness 适用于对象参数,而不适用于函数本身。constness 的表达方式与成员函数的声明 - 在带括号的参数列表之后)

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

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

然而,void()and在技术上是独立的类型void const()的意义上是不同的voidvoid const所有 const 限定类型都不同于它们的非 const 对应类型。因此,指向 const 返回函数和非 const 返回函数的函数指针是不同的函数指针类型。因此,该标准不允许将指向一种类型的函数指针绑定到另一种类型的函数。

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

于 2018-10-19T16:08:56.573 回答
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 ()(函数返回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::amatchb的参数类型:

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

我建议第二个const void没有真正意义。

于 2018-10-19T20:54:41.873 回答