【问题标题】:const void (* to function)const void (* 到函数)
【发布时间】:2018-10-19 15:55:53
【问题描述】:

有什么区别:

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() 的返回类型为const void,则上述示例有效。

【问题讨论】:

  • 离题:在处理函数指针时最好使用typedefusing。我发现即使是简单的也令人困惑。盯着你的声明看了几分钟,直到我放弃了:P
  • 第二,你的函数返回const void这没有意义...
  • 你能显示你说的代码不起作用以及你得到的错误吗?使用两者中的任何一个时我都无法重现错误
  • @user463035818 但从不 typedef 指针。如果需要,请键入函数类型,并在指针上显式使用星号。
  • 不知道,虽然语言已经够复杂了,那为什么要为const void 制定一个特殊规则呢?无论如何它都没用?

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 除非你的意思是 void return type 而不是 return value 这个答案非常令人困惑,并且可能具有误导性。
  • @anddero 你不能通过函数指针修改函数,不管它是不是const
  • @user463035818 tru,编辑:但你确定?
  • @anddero 关于 c++ 我从来没有 100% 确定任何事情
  • @anddero 好的,我的回答有点过头了。 const 返回类型在返回类类型时会有所不同。返回基本类型时没有区别,尤其是在没有返回任何内容时。我已经修改了答案。
【解决方案2】:

从“内在”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 函数”与“可变函数”。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多